[英]Why does the background image only appear after the window is resized?
我正在通过Swing Java库创建一个带有背景图像的简单窗口。
问题是:仅当您调整窗口大小时才会显示背景图像。
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.MediaTracker;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.Toolkit;
public class StartWindow {
JFrame frame;
private JButton button;
private JButton button2;
public void CreateStartWindow() {
frame = Window.createwindow();
Container container = frame.getContentPane();
JpanelStart panel = new JpanelStart();
container.add(panel);
this.button = new JButton("Start");
this.button2 = new JButton("Classifica");
panel.add(button);
panel.add(button2);
}
public void addActionListener(ActionListener al) {
this.button.addActionListener(al);
this.button2.addActionListener(al);
}
public void chiudi() {
frame.dispose();
}
}
class JpanelStart extends JPanel {
private Image img;
private String path_img="img/sfondo.jpg";
public JpanelStart(){
img = Toolkit.getDefaultToolkit().createImage(path_img);
loadImage(img);
}
private void loadImage(Image img) {
try {
MediaTracker track = new MediaTracker(this);
track.addImage(img, 0);
track.waitForID(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g){
setOpaque(false);
g.drawImage(img,0, 0, null);
super.paintComponent(g);
}
}
public class Window extends JFrame {
public static JFrame createwindow() {//fare singleton
JFrame frame = new JFrame("Battaglia navale");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(640, 640);
frame.setVisible(true);
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(((int)dim.getWidth()-(int)frame.getWidth())/2,
((int)dim.getHeight()-(int)frame.getHeight())/2);
return frame;
}
;
}
如果可能,请在将组件添加到框架后在框架上调用setVisible
,否则您将需要使用revalidate
和repaint
。
绘制super.paintComponent
东西后不要调用super.paintComponent
,因为这很可能会清除Graphics
上下文
不要使用paintComponent
方法更改任何组件的状态,从paint方法内部调用setOpaque
是错误的主意,因为假设组件是不透明的,已经准备好Graphics
上下文
正如已经建议的那样,您应该this
参数作为drawImage
的最后一个参数传递,尤其是因为加载图像的方式。 就个人而言,我更喜欢使用ImageIO
加载图像,因为当图像加载失败时,它提供了更多细节。
在这条线...
g.drawImage(img,0, 0, null);
...您将传递null
作为ImageObserver
,因此在加载图像时不会告诉您的组件重新绘制。 你应该通过this
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.