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

为什么我不能用图形在面板上绘制

龙星辰
2023-03-14

当我运行这个代码时,我看不到椭圆形,我只能看到一个空白的框架。我知道我可以使用PaintComponent(Graphics g)方法,但我很想知道为什么我的代码不能工作。

public class Check {

    public static void main(String[] args) {    
        Check c = new Check();
        c.init();   
    }

    public void init() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(3);   

        JPanel panel = new JPanel();

        frame.setSize(new Dimension(800, 600));
        frame.setTitle("Test");
        frame.setVisible(true);
        frame.getContentPane().add(panel);

        Graphics2D g = (Graphics2D)panel.getGraphics();
        g.setColor(Color.BLUE);
        g.fillOval(50, 50, 50, 50);

    }

共有1个答案

白弘伟
2023-03-14

所有Swing代码都应该在事件调度线程(EDT)上执行。这确保代码是单线程的。有关更多信息,请阅读关于并发的Swing教程。本教程还包括一节关于自定义绘画您应该阅读。

在您的示例中,代码并没有按照您认为的顺序执行,因为一些绘制代码被放置在EDT上,并且在绘制椭圆形之后重新绘制框架。

import java.awt.*;
import javax.swing.*;

public class Check {

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Check c = new Check();
                c.init();
            }
        });
    }

    public void init() {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(3);

        JPanel panel = new JPanel();

        frame.setSize(new Dimension(800, 600));
        frame.setTitle("Test");
        frame.getContentPane().add(panel);
        frame.setVisible(true);

        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                Graphics2D g = (Graphics2D)panel.getGraphics();
                g.setColor(Color.BLUE);
                g.fillOval(50, 50, 50, 50);
            }
        });
    }
}

这就是为什么永远不要使用getgraphics()的另一个原因。它只是暂时的绘制,一旦Swing确定某个组件需要重新绘制,它就会丢失。只需尝试调整框架大小,看看会发生什么。

 类似资料:
  • 我需要一些帮助,情况是我能够返回新的CSV文件,但无法将绘图图返回到另一个页面,并且我在不同的场景下分离了。有人能指出我应该对代码做什么吗?或者给我一些提示,提前谢谢! 应用程序。派克

  • 我正在尝试用numpy、matplotlib和tkinter创建生活游戏。我计划首先询问用户游戏板上有多少行和列,以及一个单元格活产卵的概率。输入这些信息后,用户将按“生成”按钮开始游戏。但是,只要按下按钮,就会弹出错误:“AttributeError:‘numpy.ndarray’object has no attribute‘set\u canvas’”。我不知道为什么FigureCanvas

  • 我的老师给了我这个 在一个n边正多边形中,所有边都有相同的长度,所有角都有相同的度数。设计一个名为正多边形的类,它包含:一个名为n的私有int数据栏,它定义了多边形中默认值为3的边的数量。一个名为side的私有双数据栏,它存储了默认值为1的边的长度。一个名为X的私有双数据栏,它定义了默认值为0的多边形中心的x坐标。一个名为Y的私有双数据栏,它定义了默认值为0的多边形中心的y坐标。创建具有指定边数、

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我想用Java绘制图形(节点和边)。但是,由于我不知道该怎么做,因此在开始之前我想寻求一些建议。 我应该怎么做? 使用Graphics2D包,对吗? 节点的标签怎么样?我应该使用诸如drawString之类的东西并手动处理所有“

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严