当前位置: 首页 > 知识库问答 >
问题:

在paintComponent()方法中时变量未更改

艾骏喆
2023-03-14

假设我制作了一个简单的图形应用程序。它有两个类,一个是主类,另一个是扩展JPanel的名为“panel”的类。主类只是一个包含JPanel的JFrame。其内容如下:

public static Panel panel = new Panel();

public static void main(String[] args) {
    JPanel p = new Panel();
    JFrame fr = new JFrame();
    fr.setSize(600, 600);
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fr.setLocationRelativeTo(null);
    fr.setVisible(true);
    fr.add(p);
    while (true) {
        fr.repaint();
        if (panel.test) panel.g2d.drawRect(30, 30, 40, 40);
    }
}

第二个类使用Graphics2D来创建JPanel的内容。它也有一些变量,这些变量在油漆组件()方法中被更改。以下是它的内容:

Graphics2D g2d;
boolean test = false;

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    test = true;
    g2d.setColor(Color.RED);
    g2d.drawRect(10, 10, 20, 20);
}

然而,这里的问题是:在执行了油漆组件()方法后,testg2g都不会改变。尽管油漆组件()方法绘制了它的矩形,但主方法的当循环中的代码永远不会最终绘制矩形。在主方法中,testg2g似乎总是分别是falsenull。我在这里错过了什么?在油漆组件()方法之外还有使用图形2D吗?

共有2个答案

阎烨
2023-03-14

尝试用相同的代码验证此方法:

            @Override
            public void paintComponents(Graphics grphcs)
            {
                super.paintComponents(grphcs);
                //add code here
            }

而且我也建议不要使用JPanel指针来awt Panel变量。所以改变:

       `JPanel p = new Panel();  to `JPanel p = new JPanel();` 
鲜于煜祺
2023-03-14

当(true)块时,去掉那个块,它是不需要的,而且是有害的,因为它有踩在GUI线程上的风险。相反,在调用JFrame上的setViable(true)之前,请添加您的JPanel。

此外,创建Graphics2D字段并尝试在paintComponent之外使用它进行绘制会引发NullPointerException。请理解,您不能完全控制Swing图形,不应尝试提取图形对象或以这种方式绘制图形。您需要阅读Swing图形教程,了解如何正确使用Swing组件进行绘制。

  • 课程:执行自定义绘画:摇摆图形入门教程
  • 在AWT和摇摆绘画:摇摆图形高级教程

所以我要回答,

在paintComponent()方法之外是否还有其他方法可以使用graphics2D?

不可以。你可以通过使用BuffereImage的图形对象来解决这个问题,但是你仍然需要将BuffereImage绘制到你的JPanel或JComponent的paintComponent方法中。

 类似资料:
  • 问题内容: 我只是实现了继承JPanel的类,如下所示 Orpanel类正在加载图像并调整其自身大小。 这是问题。 调用JFrame的setContentpane(Orpanel的实例)使其工作正常,但是当我将Orpanel附加到JFrame时,调用add()方法而不是setContentpane(我知道setcontentpane并不意味着attach ..反正),它就行不通了。 终于弄清楚了当

  • 我在更改联系人对象中的变量值时遇到问题。我正在尝试制作一个联系人列表,但我无法更改变量trach方法的值。我有editTouch方法调用change eName方法,这两个方法都传递了ArrayList对象trach引用,所以它不应该在main方法中更改值trach ArrayList时出现问题,但问题是当我想更改对象的名称时它不会更改它。我这里缺少什么吗?

  • 我在同一个包中有两个java文件。我想将一个变量的更新值从一个文件传递到另一个文件。我编写了以下代码。在1班。java:- class2.java:- 问题是最终值打印是的,不应该打印。输出应该很好。请帮我。

  • 问题内容: 我有一个ng- view以外的NavbarCtrl。我有一个与服务对话以使用户登录的登录控制器。用户登录后,我希望导航栏更新为用户的电子邮件地址。但是,对我而言,一旦用户登录,我似乎无法让Navbar范围更新加载到我的“ Auth”服务中的数据。 这是我的主要index.html: 而我的服务: 还有我的Login和Navbar控制器: 从我的研究中,我会认为$ scope.user

  • 我在使用GetCircleArea()方法时遇到问题。请帮忙。我坐在这里,不知道该怎么办了。 非常感谢。寻找答案!

  • 问题内容: 我在测试代码中有一个数组 要求arr [0] .GetId() 服务器是接口。ServerInstance是实现接口方法的结构,即 我有一个像 这正在更新结构的变量“ Id”。我确定值会更新为- 但这并没有反映在第3行的通话中 _*_更新* 范例 http://play.golang.org/p/zUqJ0hEjxv 问题答案: 您在添加结构时将其复制,而不是在示例中放置指向结构本身的