我很难理解Java 2d中的基本概念。
给出一个具体的例子:
一个人可以通过实现自己的方法来自定义摇摆组件 paintComponent(Graphics g)
图形可用于该方法的主体。
问题:
该图形对象到底是什么,我的意思是它与具有该方法的对象的相关性 paintComponent?好的,我知道您可以做类似的事情:

g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());

要涂上灰色的椭圆形。我无法理解的是,图形对象与组件和画布有何关系。该图实际上是如何完成的?
另一个例子:

public class MyComponent extends JComponent {

     protected void paintComponent(Graphics g) {

                System.out.println("Width:"+getWidth()+", Height:"+getHeight());

            }

    public static void main(String args[]) {

                JFrame f = new JFrame("Some frame");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(200, 90);
                MyComponent  component = new MyComponent  ();
                f.add(component);
                f.setVisible(true);       
          }
 }

这是打印的

宽度:184,身高:52

这个尺寸意味着什么?我没有在尺寸框架上添加任何东西(200,90)。

更新:
我了解我必须覆盖油漆才能给予 Graphics g 反对进行重新粉刷所需的提示,而我不必创建一个 Graphics 对象作为一个平台给出。
在那之后发生的事情是我无法理解的。
例如 Graphics 一旦我开始调用各种 g.setXXX 方法?
它是否被存储在队列中,并且之间有1-1的关联 g 和每个 component?因此该框架使用每个 g 每个组件一次绘制一次?
这是如何运作的?对此的任何帮助非常欢迎

谢谢

有帮助吗?

解决方案

该组件不会创建静态图形对象关联。

图形对象是平台手柄的包装器,可访问屏幕等物理设备。这是有效的,仅执行“油漆”,您将无法存储并以后再用。它是由“工具包”管理的资源。

该组件本身是窗口系统顶部的抽象,它与此设备很快就会被渲染。

编辑

如果您觉得有必要从“油漆”回调中绘画,则可以强制这种称为“ GetGraphics”的关联。这应该是一个非常罕见的情况,您始终应该在之后处理图形。

其他提示

我了解您的问题,因为我在学习Java图形时努力挣扎了一段时间。这不仅是Java 2D图形 - 它是AWT的一部分。

当您创建Jframe或其他一些顶级对象时,它会在“幕后”进行大量工作 - 其中一部分是创建图形对象。 (没有明确的通知,尽管如果您使用调试器踏入代码,则可能会看到创建图形的类)。

然后,您可以创建添加的组件,或者在顶级对象中注册。所有这些都必须实现呼叫方法,包括

paint(Graphics g);

然后,您将@Override这些方法,以便在渲染组件时使用您的油漆方法。

不要尝试保存图形或创建新图形。将其视为减轻您的责任的框架。

组件的大小通常是从您的手中取出的。如果您使用布局管理器,则可以决定调整组件大小。

如果您来自程序命令背景,您可能会遇到问题(我来自Fortran)。我的建议是尝试许多教程,并且在某个阶段 - 启蒙将开始来。

Java图形的一般文档很差。有很多不透明的概念(请参阅 java graphics.drawimage()如何工作? )。早期的实施被赶紧通过,并有许多错误。即使是现在,通常仍不清楚是否以及您应该以什么顺序调用方法,例如 setPack()setVisible().

这并不意味着您不应该使用它!只是学习曲线比IMO应该更长。

更多:您也不决定何时绘画,框架确实可以。 paint(g) 确实意味着“ Framweork正在重新粉刷其组件。您希望此组件在此阶段提供什么”。

也许 providePaintingInstructionsWhenRequiredForComponentGraphics(Graphics g) 将是一个有用的名称。

相似地 repaint() 不要对您的订单重新粉刷,但是当系统认为应该这样做时。我没有发现它有用。

如果您(说)以交互式调整组件大小,每个轻微的更改通常都会触发 paint(g). 。尝试将log.debug()放入油漆代码中,并查看何时被调用。

这个尺寸意味着什么?我没有在尺寸框架上添加任何东西(200,90)。

您将组件添加到框架中,并将框架的大小设置为(200,90)。框架内容窗格的默认布局管理器是BorderLayout,这意味着您添加的组件获得了所有可用空间。该框架需要标题条和边界的一些空间,因此您的组件获得剩余的空间。

想想一个 Graphics 就像一张纸,您绘制的纸张表明如何 Component 好像 那一刻. 。绘制它后,框架工具包将修剪边缘,并显示您绘制的内容以显示组件。此外,下次绘制组件时,您将在另一张纸上绘制,因此请不要保留旧的 Graphics 大约。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top