繁体   English   中英

java 2D和swing

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM