【问题标题】:PaintComponent in JPanel not being calledJPanel 中的 PaintComponent 未被调用
【发布时间】:2014-03-06 16:33:00
【问题描述】:

我正在编写一个 Java 应用程序并尝试绘制一个 BufferedImage。在我的主要工作中,正在创建 JFrame,正在创建 JPanel 并将其添加到 JFrame。还有一个线程正在启​​动以进行重新绘制,但它什么也没显示,并且我在paintComponent 中的 System.out.println() 也没有被调用。我用谷歌搜索了很多,但我没有找到解决我的问题的方法。

我做错了什么,为什么错了???

我的代码:

主+线程:

public class Main extends Thread
{
    public static Frame frame = new Frame();

    public static void main(String[] args) throws IllegalStateException, IOException
    {
        frame.activePanel = new LoginPanel();
        frame.add(frame.activePanel);

        new Main();
    }

    public Main()
    {
        this.start();
    }

    @Override
    public void run()
    {
        while(true)
        {
            if(Main.frame.activePanel != null)
                Main.frame.activePanel.repaint();

            try{Thread.sleep(15);}catch(InterruptedException e){}
        }
    }
}

JFrame:

public class Frame extends JFrame
{
    public JPanel activePanel = null;

    public Frame()
    {
        super();

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setBounds(this.getToolkit().getScreenSize().width / 2 - 640,this.getToolkit().getScreenSize().height / 2 - 400,1279,799);
        this.setResizable(false);
        this.setUndecorated(true);
        this.setVisible(true);
    }
}

和 JPanel:

public class LoginPanel extends JPanel
{
    BufferedImage loginImg;

    public LoginPanel() throws IOException
    {
        loginImg  = ImageIO.read(new File("src/images/Login.PNG"));
    }

    @Override
    protected void paintComponent(Graphics g)
    {System.out.println("painting");
        g.drawImage(loginImg, 0, 0, null);
    }
}

【问题讨论】:

  • 不确定...但是如果您不覆盖paintComponent会怎样?
  • 同样,我得到一个白色/灰色窗口。可悲的是,这种方式我无法检查它是否被调用。
  • 哇,哇!在 Swing 中处理线程时必须小心,也不需要定期调用 repaint,如果在绘制后添加/删除组件,则需要调用 repaint。请阅读how to use threads in swing你只能从Event dispatch thread修改GUI。
  • 谢谢,我会看的。

标签: java multithreading swing jpanel paintcomponent


【解决方案1】:

在我看来,您在框架可见之后将面板添加到框架中。执行此操作时,不会调用布局管理器,并且面板的大小为 (0, 0),因此没有可绘制的内容。

重构您的代码。面板的创建应该在 Frame 类中完成,而不是在 Main 类中。

另外,使用更好的名称而不是 Frame。 AWT 已经有一个名为 Frame 的类,所以你的名字很混乱。使您的班级名称更具描述性。

【讨论】:

  • 非常感谢,它有效。我已经把 Frame 改成了另一个名字,你是对的,这是一个奇怪的名字。我刚刚编辑了我的主要内容,以便在短时间内将框架设置为不可见:frame.activePanel = new LoginPanel(); frame.add(frame.activePanel); frame.setVisible(false); frame.setVisible(true);新的 Main();
  • @Geosearchef, I just edited my main, so that the frame is set invisible for a short time - 不!这不是解决问题的方法!!!登录面板属于框架类,所以应该在框架类中创建。不要走捷径!!!
  • 你是对的,但它不想写清晰的代码,我想很快写一个小应用程序。有时间我会改的。
  • @Geosearchef, i judt wanted to write a little application very quick. - 为什么您认为正确编写应用程序需要更多时间?想一想您一直在浪费时间尝试调试代码,因为您没有从一开始就正确编写代码。花更多时间进行前期设计以正确完成它,您将节省更多调试时间。
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 2016-03-04
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多