java - 除非调整窗口大小,否则组件不会显示 - Java

标签 java image swing resize components

单击按钮后,我遇到图像可见性问题。我有带框架的主类:

package superworld;

import java.awt.*;
import javax.swing.*;
public class SuperWorld {


    public static void main(String[] args) {

        JFrame frame= new JFrame();
       frame.setSize(1050,650);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
       frame.add(new SuperPanel());
       frame.setVisible(true);
    //   frame.setResizable(false);
    }

}

然后我使用包含所有组件的面板进行类(class):

package superworld;

import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.Timer;

public class SuperPanel extends JPanel implements ActionListener{

        Timer mainTimer;
    public static final int HEIGHT = 550;
    public static final int WIDTH = 1050;
        int i;
        int w=-100;
        int h=-50;
        ArrayList<SuperMiasto> miasta = new ArrayList<SuperMiasto>();

   private JButton heroButton;
   private JButton cywilButton;


    public SuperPanel() {
        mainTimer = new Timer(10,this);
               heroButton = new HeroButton(this);
               cywilButton = new CywilButton(this);
        setLayout(null);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setBackground(Color.GREEN);                           
                for(i=0;i<10;i++)
                {
                    miasta.add( new SuperMiasto() );
                    miasta.get(i).x=w;
                    miasta.get(i).y=h;
                    miasta.get(i).imagelabel = new JLabel(miasta.get(i).image);
                    miasta.get(i).imagelabel.setBounds(miasta.get(i).x,miasta.get(i).y,miasta.get(i).image.getIconWidth(),miasta.get(i).image.getIconHeight());
                    add(miasta.get(i).imagelabel);
                    w=w+200;
                    if (w > WIDTH-200)
                    {
                        h=h+200;
                        w=-100;
                    }
                }

    }
      public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
           add(heroButton); 
           add(cywilButton);               
    }   
      public void actionPerformed(ActionEvent e) {
            repaint();
    }
}

以及带有添加带有图像的新对象的按钮的类:

package superworld;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class HeroButton extends JButton implements ActionListener {

    private JPanel buttonPanel;

    HeroButton(JPanel buttonPanel) {
        super("Dodaj hero");
        this.buttonPanel = buttonPanel;
                setBounds(0,500,150,50);
        addActionListener(this);              
    }

    @Override
    public void actionPerformed(ActionEvent e) {
            SuperLudzie batman = new SuperLudzie();
            batman.imagelabel = new JLabel(batman.image);
            batman.imagelabel.setBounds(50,50,batman.image.getIconWidth(),batman.image.getIconHeight());
        buttonPanel.add(batman.imagelabel);                
    }
}

这个 SuperLudzie 的类:

package superworld;

import java.awt.*;
import javax.swing.*;

public class SuperLudzie {
    private String imie;
    private int zycie;
    private int inteligencja;
    private int wytrzymalosc;
    private int sila; 
    private int umiejetnosci_walki;
    private int x,y;
    ImageIcon image = new ImageIcon("C:/Users/Zuzanna Sawala/Moje dokumenty/NetBeansProjects/SuperWorld/mysz.jpg");
    JLabel imagelabel;
}

一切都很好。我唯一的问题是这个对象和由按钮创建的图像在单击后但在调整窗口大小后不可见。我知道它与 setVisibility(true); 有关。但我不知道在哪里使用它。

最佳答案

使用SwingUtilities.invokeLater()EventQueue.invokeLater()确保EDT已正确初始化。

使用重写的paintComponent()方法而不是paint()

class SuperPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}

Read more points...

尽量避免 null 布局并使用适合我们需要的正确布局。

请查看How to Use Various Layout Managers全权负责组件的定位和尺寸调整。

关于java - 除非调整窗口大小,否则组件不会显示 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264523/

相关文章:

java - 在 miglayou 中调整表格大小

当我取消 SwingWorker 时,Java SwingWorker 套接字服务器不会被取消

java - 使用带有 Java 和 GWT 的 GChart 堆积条形图?

java - 如何制作一个完美的延迟时间,使其只计算一次

java - 这是ButtonGroup的影响吗?

c++ - 如何使用 OpenCV 降低图像的每像素位数

Java - JButton 与变化的背景

java - 如何在java中的csv文件中将新记录放入新行

java - 如何使用 Gwt 将生成的图像从服务器获取到客户端

javascript - 拉伸(stretch) <img> 以适合整个屏幕,而不保持宽高比且没有滚动条