[英]java 2D and swing
我很难理解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
这个大小是什么意思? 我没有在size(200,90)的框架中添加任何内容。
更新:
我知道我必须重写paint以在Graphics g
对象中提供进行重新绘制所需的提示,并且我不必创建Graphics
对象,因为平台将提供该对象。
在那之后发生的事情是我无法理解的。
例如,当我开始调用各种g.setXXX
方法时,“ Graphics
代表屏幕,并相应地在屏幕上绘制对象?
它是否存储在队列中,并且g
与每个component
之间存在1-1关联? 因此,框架使用每种成分的每g
一次绘制一次吗?
这是如何运作的? 我们对此表示任何帮助
谢谢
在学习Java图形时,我为解决这一问题而苦苦挣扎了一段时间,因此我了解您的问题。 不只是Java 2D图形-它还是AWT的一部分。
当您创建JFrame或其他一些顶级对象时,它会在“幕后”做很多工作-其中一部分是创建Graphics对象。 (虽然没有明确通知,但是如果您使用调试器逐步执行代码,则可能会看到创建Graphics的类)。
然后,您创建要添加或注册顶级对象的组件。 这些都必须实现回调方法,包括
paint(Graphics g);
然后,您将@Override这些方法,以便在渲染组件时使用您的绘制方法。
不要尝试保存图形或创建新图形。 将其视为承担责任的框架。
组件的大小通常不费吹灰之力。 如果使用布局管理器,则它可能会决定调整组件的大小。
如果您来自程序性命令背景,那么您可能会遇到问题(我来自FORTRAN)。 我的建议是尝试一些教程,并且-在某个阶段-启迪将开始。
Java图形的常规文档很差。 有许多不透明的概念(请参阅Java Graphics.drawImage()的工作方式以及ImageObserver的作用 )。 早期的实施很匆忙,存在许多错误。 即使到现在,也常常不清楚是否应该以什么顺序调用诸如setPack()
和setVisible()
。
这并不意味着您不应该使用它! 只是学习曲线比IMO长一些。
更多:同样,您也不必确定何时绘制某些东西,而框架会确定。 paint(g)
真正含义是“ framweork正在重新粉刷其组件。您希望此组件在此阶段提供什么?”。
也许providePaintingInstructionsWhenRequiredForComponentGraphics(Graphics g)
是一个有用的名称。
同样, repaint()
不会按您的订单重画,而是在系统认为应该的时候重画。 我还没有发现它有用。
如果您(说)以交互方式调整组件的大小,通常每个微小的更改都会触发paint(g)
。 尝试将LOG.debug()放入绘画代码中,看看它何时被调用。
这个大小是什么意思? 我没有在size(200,90)的框架中添加任何内容。
您将组件添加到框架,并将框架的大小设置为(200,90)。 框架内容窗格的默认布局管理器是BorderLayout,这意味着添加的组件将获取所有可用空间。 框架需要一些空间来容纳标题栏和边框,因此组件将获得剩余空间。
该组件不会创建静态Graphics对象关联。
图形对象是平台句柄的包装,可用于访问物理设备(例如屏幕)。 仅在执行“绘画”时有效,您不能存储它,以后再使用。 它是由“工具箱”管理的资源。
组件本身是窗口系统顶部的抽象,它很快与此设备关联以进行渲染。
编辑
如果您认为需要从“ paint”回调中进行绘制,则可以强制调用“ getGraphics”这样的关联。 这应该是非常少见的情况,您始终应在以后处置图形。
将Graphics
想象成一张纸,您可以用它画出该Component
在那时的外观。 绘制完之后,框架工具包将修剪掉边缘并显示您绘制的内容以显示组件。 此外,下次绘制组件时,您将在另一张纸上进行绘制,因此不要保留旧的Graphics
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.