【发布时间】: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