Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java2D和swing_Java_Swing_Graphics_Java 2d_Paintcomponent - Fatal编程技术网

Java2D和swing

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()); 画一个灰色的椭圆形。我无法理解

我很难理解Java 2D中的一个基本概念。
举一个具体的例子:
您可以通过实现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()
不会按照您的命令重新绘制,而是在系统认为应该重新绘制时重新绘制。我觉得它没用。