为什么背景图像仅在调整窗口大小后出现?

时间:2014-01-14 20:40:41

标签: java image swing

我正在通过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;
         }
     ;
      }

2 个答案:

答案 0 :(得分:2)

如果可能,请在向其添加组件后调用框架上的setVisible,否则您需要使用revalidaterepaint

在您绘制内容后不要致电super.paintComponent,因为它可能会清除Graphics上下文

不要使用paintComponent方法更改任何组件的状态,在paint方法中调用setOpaque是不好的是一个坏主意,因为Graphics上下文已经假设组件不透明而准备好

正如已经建议的那样,您应该将this作为最后一个参数传递给drawImage,尤其是因为您加载图片的方式。就个人而言,我更喜欢使用ImageIO来加载图片,因为它在图片无法加载时提供了更多细节....

答案 1 :(得分:1)

在这一行......

g.drawImage(img,0, 0, null);

...您正在将null作为ImageObserver传递,因此在加载图像时不会告诉您的组件重绘。你应该通过this