【问题标题】:Java why cant I draw on panel using graphicsJava 为什么我不能使用图形在面板上绘图
【发布时间】:2015-10-27 02:31:19
【问题描述】:

当我运行这段代码时,我看不到椭圆,我只能看到一个空白框。 我知道我可以使用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);

    }

【问题讨论】:

  • 只是一个猜测,但我认为 panel 添加了大小 0x0
  • 重新打开了问题,因为重复的链接没有回答问题,并且发布的示例不是一个很好的示例,因为 GUI 不是在 EDT 上创建的,并且自定义绘画没有覆盖 getPreferredSize()。 Custom Painting 上的 Swing 教程通过重写 paintComponent() 和 `getPreferredSize() 方法并将所有代码放在事件调度线程上,展示了更好的方法。
  • @Gimby,很高兴你同意我的回答。
  • “谢谢大家帮助我!顺序是问题..” 这个问题不适合放置答案!它应该进入下面的单独答案(是的,您可以回答您自己的问题)。顺便说一句 - 除非自定义绘画代码已经完全重新设计,否则问题并没有真正得到解决。

标签: java swing graphics


【解决方案1】:

所有 Swing 代码都应在事件调度线程 (EDT) 上执行。这确保代码是单线程的。阅读Concurrency 上的 Swing 教程以获取更多信息。本教程还包括您应该阅读的关于Custom Painting 的部分。

在您的示例中,代码未按您认为的顺序执行,因为一些绘画代码放置在 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 确定需要重新绘制组件,它就会丢失。只需尝试调整框架的大小,看看会发生什么。

【讨论】:

  • 很高兴你重新打开了这个。现在也许您应该将问题恢复到关闭之前的状态:/
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2013-07-21
  • 2019-07-15
  • 1970-01-01
相关资源
最近更新 更多