我正在编写Java应用程序并尝试绘制BufferedImage。在我的主要内容中,正在创建JFrame并正在创建JPanel并将其添加到JFrame中。还有一个Thread正在重新绘制,但它没有显示任何内容,并且我的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);
}
}
答案 0 :(得分:2)
在我看来,就像你在框架可见之后将面板添加到框架一样。执行此操作时,不会调用布局管理器,并且面板的大小为(0,0),因此无需绘制任何内容。
重构您的代码。面板的创建应该在Frame类中完成,而不是在Main类中完成。
此外,使用更好的名称而不是Frame。 AWT已经有一个名为Frame的类,所以你的名字很混乱。使您的班级名称更具描述性。