我无法理解Java 2D中的基本概念
举一个具体的例子:
可以通过实现方法paintComponent(Graphics g)
的自己版本来定制swing组件
图形可用于该方法的主体
问:
究竟是什么Graphics对象,我的意思是它与具有方法paintComponent
的对象有什么关系?好的,我知道你可以这样做:
g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());
要画一个灰色的椭圆形。我无法理解的是Graphics对象如何与组件和画布相关。这幅画如何实际完成?
另一个例子:
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
对象,因为平台会给出一个。{br / >
之后会发生什么是我无法理解的
例如。 Graphics
代表屏幕,一旦我开始调用各种g.setXXX
方法,屏幕上的对象就会相应地绘制出来吗?
它是否存储在队列中,g
和每个component
之间存在1-1关联?所以框架使用每个组件的每个g
一次绘制一个?
这是如何运作的?
对此非常欢迎
由于
答案 0 :(得分:2)
我理解你的问题,因为我在学习Java图形的过程中遇到了一段时间。这不仅仅是Java 2D图形 - 它是AWT的一部分。
当你创建一个JFrame或其他一些顶级对象时,它会在“幕后”做很多工作 - 其中一部分是创建一个Graphics对象。 (没有明确的通知,但如果您使用调试器逐步执行代码,则可能会看到创建图形的类。)
然后,您可以创建添加或注册顶级对象的组件。这些都必须实现回调方法,包括
paint(Graphics g);
然后,您将@Override这些方法,以便在渲染组件时使用您的绘制方法。
请勿尝试保存图形或创建新图形。把它想象成一个让你承担责任的框架。
组件的大小通常取决于您的手。如果您使用布局管理器,则可能决定调整组件的大小。
如果你来自程序性命令背景,你可能会遇到问题(我来自FORTRAN)。我的建议是尝试一些教程,并且 - 在某个阶段 - 启蒙将开始。
Java图形的一般文档很差。有许多不透明的概念(见How does Java Graphics.drawImage() work and what is the role of ImageObserver)。早期的实施已经匆忙完成并且有很多错误。即使是现在,通常也不清楚是否应该调用setPack()
和setVisible()
之类的方法。
这并不意味着你不应该使用它!只是学习曲线比IMO要长一点。
MORE:
此外,您还没有决定何时绘制内容。 paint(g)
的确意味着“framweork正在重新绘制它的组件。在这个阶段你想要这个组件提供什么”。
也许providePaintingInstructionsWhenRequiredForComponentGraphics(Graphics g)
会是一个有用的名字。
同样repaint()
不会在您的订单上重新绘制,但系统认为它应该重新绘制。我发现它没用。
如果您(比方说)以交互方式调整组件大小,则每次轻微更改通常会触发paint(g)
。尝试在绘图代码中放置一个LOG.debug()并查看它何时被调用。
答案 1 :(得分:2)
这个尺码是什么意思?我没有在尺寸框架中添加任何东西(200,90)。
您已将组件添加到框架中,并将框架的大小设置为(200,90)。框架内容窗格的默认布局管理器是BorderLayout,这意味着您添加的组件将获得所有可用空间。框架需要一些空间用于标题栏和边框,因此您的组件将获得剩余空间。
答案 2 :(得分:1)
组件不会创建静态Graphics对象关联。
图形对象是平台句柄的包装器,可以访问物理设备,如屏幕。它仅对“paint”执行时有效,您无法存储它并在以后重复使用它。它是由“工具包”管理的资源。
组件本身是一个窗口系统之上的抽象,很快就会被这个设备所取代以进行渲染。
修改
如果您觉得需要绘制“paint”回调,可以强制调用“getGraphics”这样的关联。这应该是一个非常罕见的情况,你总是应该在之后处理图形。
答案 3 :(得分:1)
想象一张Graphics
就像一张纸,用来展示Component
当时的样子。绘制完成后,框架工具包将修剪边缘并显示您绘制的内容以显示组件。此外,下次绘制组件时,您将使用不同的纸张进行绘制,因此请不要保留旧的Graphics
。