我正在通过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;
}
;
}
答案 0 :(得分:2)
如果可能,请在向其添加组件后调用框架上的setVisible
,否则您需要使用revalidate
和repaint
。
在您绘制内容后不要致电super.paintComponent
,因为它可能会清除Graphics
上下文
不要使用paintComponent
方法更改任何组件的状态,在paint方法中调用setOpaque
是不好的是一个坏主意,因为Graphics
上下文已经假设组件不透明而准备好
正如已经建议的那样,您应该将this
作为最后一个参数传递给drawImage
,尤其是因为您加载图片的方式。就个人而言,我更喜欢使用ImageIO
来加载图片,因为它在图片无法加载时提供了更多细节....
答案 1 :(得分:1)
在这一行......
g.drawImage(img,0, 0, null);
...您正在将null
作为ImageObserver
传递,因此在加载图像时不会告诉您的组件重绘。你应该通过this
。