繁体   English   中英

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

[英]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 ,否则您将需要使用revalidaterepaint

绘制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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM