Java2D和swing
我很难理解Java 2D中的一个基本概念。Java2D和swing,java,swing,graphics,java-2d,paintcomponent,Java,Swing,Graphics,Java 2d,Paintcomponent,我很难理解Java 2D中的一个基本概念。 举一个具体的例子: 您可以通过实现swing组件自己版本的方法来定制swing组件paintComponent(Graphics g) 图形可用于方法主体。 问题: 这个图形对象到底是什么,我的意思是它与具有方法paintComponent的对象的关系如何?好的,我知道你可以做如下事情: g.setColor(Color.GRAY); g.fillOval(0, 0, getWidth(), getHeight()); 画一个灰色的椭圆形。我无法理解
举一个具体的例子:
您可以通过实现swing组件自己版本的方法来定制swing组件
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)的框架中添加任何内容
更新:我理解,我必须覆盖绘制,以便在
图形g
对象中提供重新绘制所需的提示,并且我不必创建图形
对象,因为平台将提供一个对象。在那之后发生的事情是我无法理解的。
例如,
Graphics
是否表示屏幕,并且只要我开始调用各种g.setXXX
方法,对象就会相应地绘制在屏幕上?它是否存储在队列中,并且
g
和每个组件之间存在1-1关联?因此,框架使用每个组件的每个g
,一次绘制一个组件?
这是怎么回事?
非常欢迎在这方面提供任何帮助
谢谢在我学习Java图形的时候,我很难理解您的问题。它不仅仅是Java 2D图形,它也是AWT的一部分
创建JFrame或其他顶级对象时,它会在“幕后”进行大量工作,其中一部分是创建图形对象。(虽然没有明确的通知,但是如果使用调试器遍历代码,您可能会看到创建图形的类)
然后创建添加或注册顶级对象的组件。这些都必须实现回调方法,包括
paint(Graphics g);
然后将@Override这些方法,以便在渲染组件时使用绘制方法
请勿尝试保存图形或创建新图形。把它想象成一个框架,让你卸下责任
组件的大小通常不在您的掌握之中。如果使用布局管理器,它可能会决定调整组件的大小
如果你来自程序命令式的背景,你很可能会遇到问题(我来自FORTRAN)。我的建议是尝试一些教程,在某个阶段,启蒙将开始到来
Java图形的一般文档很差。有许多概念是不透明的(请参阅)。早期的实现是仓促完成的,有很多错误。即使是现在,仍然不清楚是否应该调用方法,以及调用方法的顺序,例如setPack()
和setVisible()
这并不意味着你不应该使用它!只是学习曲线比我想象的要长一点
更多:
此外,你不需要决定什么时候画东西,框架会决定<代码>绘制(g)
的真正意思是“框架正在重新绘制其组件。在此阶段,您希望该组件提供什么”
可能提供组件图形(图形g)所需的绘制说明将是一个有用的名称
类似地,repaint()
不会按照您的命令重新绘制,而是在系统认为应该重新绘制时重新绘制。我觉得它没用
如果你(比如说)以交互方式调整组件的大小,每一个微小的更改通常都会触发绘制(g)
。尝试在绘制代码中放入LOG.debug(),并查看它何时被调用。在学习Java graphics时,我曾与您的问题斗争过一段时间,我理解您的问题。它不仅仅是Java 2D图形,它也是AWT的一部分
创建JFrame或其他顶级对象时,它会在“幕后”进行大量工作,其中一部分是创建图形对象。(虽然没有明确的通知,但是如果使用调试器遍历代码,您可能会看到创建图形的类)
然后创建添加或注册顶级对象的组件。这些都必须实现回调方法,包括
paint(Graphics g);
然后将@Override这些方法,以便在渲染组件时使用绘制方法
请勿尝试保存图形或创建新图形。把它想象成一个框架,让你卸下责任
组件的大小通常不在您的掌握之中。如果使用布局管理器,它可能会决定调整组件的大小
如果你来自程序命令式的背景,你很可能会遇到问题(我来自FORTRAN)。我的建议是尝试一些教程,在某个阶段,启蒙将开始到来
Java图形的一般文档很差。有许多概念是不透明的(请参阅)。早期的实现是仓促完成的,有很多错误。即使是现在,仍然不清楚是否应该调用方法,以及调用方法的顺序,例如setPack()
和setVisible()
这并不意味着你不应该使用它!只是学习曲线比我想象的要长一点
更多:
此外,你不需要决定什么时候画东西,框架会决定<代码>绘制(g)
的真正意思是“框架正在重新绘制其组件。在此阶段,您希望该组件提供什么”
可能提供组件图形(图形g)所需的绘制说明将是一个有用的名称
类似地,repaint()
不会按照您的命令重新绘制,而是在系统认为应该重新绘制时重新绘制。我觉得它没用。