Java:Image赢得';在调整窗口大小之前,我不会显示
我正在用java编程,我正在学习GUI和图形。在我的程序中,我在JPanel上绘制了一个图像,并将JPanel添加到主窗口中。我遇到的问题是,当我运行程序时,直到我手动调整窗口大小,图像才会显示。以下是相关代码: 在绘制图像的位置:Java:Image赢得';在调整窗口大小之前,我不会显示,java,image,user-interface,resize,jpanel,Java,Image,User Interface,Resize,Jpanel,我正在用java编程,我正在学习GUI和图形。在我的程序中,我在JPanel上绘制了一个图像,并将JPanel添加到主窗口中。我遇到的问题是,当我运行程序时,直到我手动调整窗口大小,图像才会显示。以下是相关代码: 在绘制图像的位置: public class painting extends JPanel{ public void paintComponent(Graphics g){ super.paintComponent(g); this.setBa
public class painting extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.WHITE);
g.drawImage(Toolkit.getDefaultToolkit().getImage("image.png"), 0, 0, null);
}
}
其中,将JPanel添加到JFrame(c是GridBagConstraints):
设置窗口的位置:
public class MainC{
public static void main (String args[]){
GUI gui = new GUI();
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.pack();
gui.setVisible(true);
gui.setTitle("Title");
}
}
谢谢,
贝内特
编辑:我注意到它有时会正确地显示图像,但如果我关闭程序并重试,它将无法工作,直到我调整它的大小
EDIT2:以下是文件,在
GUI
构造函数中,您应该先调用super()
并动议:
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.pack();
gui.setVisible(true);
gui.setTitle("Title");
在GUI构造函数中。执行
Toolkit.getDefaultToolkit().getImage("image.png")
给你带来照片了吗?
我试了一下:
public class Gui extends JFrame{
public Gui() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
this.setBounds(100, 100, 300, 300);
JPanel pnl = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.WHITE);
try {
g.drawImage(new Robot().createScreenCapture(new Rectangle(90, 90)), 0, 0, null);
} catch (AWTException e) {
e.printStackTrace();
}
}
};
getContentPane().add(pnl, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Gui().setVisible(true);
}
});
}
它是有效的。您的问题一定在代码的其他地方。我将您的三个类复制并粘贴到我的IDE中。我唯一改变的是在GUI.java中添加了
setLayout(newgridbaglayout())代码>和GridBagConstraints c=新的GridBagConstraints()代码>,我将图像的位置更改为我自己的位置。窗口按预期工作,图像立即显示
我假设这里没有显示其他代码,比如我添加的c的初始化。检查其他代码,确保最初没有在图像上重新绘制。另外,如果您发布其他代码,我可以帮助您确定问题所在。Toolkit.getImage()
异步工作。使用ImageIO.read()
或添加一个MediaTracker
我试过了,但仍然不起作用。我可以让Jframe和JPanel显示,但图片没有显示。@Giggums先生,调用挫折背景(…)
的目的是什么?另外,您不应该在paintComponent(…)
中加载图像。您可能希望尝试使用事件调度线程。要更快获得更好的帮助,请发布一个。不过请注意,如果您执行mre和我自己提供的建议,我怀疑问题会得到解决。我最终使用ImageIO.read()使其正常工作。谢谢大家对我的帮助。为了扩展Chris的建议,请确保在EDT上创建并更新GUI元素。不这样做可能会导致偶尔出现渲染错误和异常。main(String[])
显然是在构建脱离EDT的GUI。有关更多详细信息,请参阅。是的Toolkit.getDefaultToolkit().getImage(“image.png”)将为我提供图片。我确实初始化了c,我的绘画类中没有更多代码,但GUI构造函数中有更多代码。但据我所知,这并没有把事情搞砸。我也可以让它每隔一段时间工作一次,但是当我关闭窗口并重试时,它就不工作了。你介意发布你所有的代码吗?我现在不能重现你的问题,所以很难调试。代码现在在我的主要帖子底部的链接中。很高兴你把它整理好了+1用于报告。+1用于描述问题和制定实际解决方案。
public class Gui extends JFrame{
public Gui() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
this.setBounds(100, 100, 300, 300);
JPanel pnl = new JPanel(){
public void paintComponent(Graphics g){
super.paintComponent(g);
this.setBackground(Color.WHITE);
try {
g.drawImage(new Robot().createScreenCapture(new Rectangle(90, 90)), 0, 0, null);
} catch (AWTException e) {
e.printStackTrace();
}
}
};
getContentPane().add(pnl, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Gui().setVisible(true);
}
});
}