单击按钮时将 ImageIcon 添加到已经可见的 GUI

Adding ImageIcon to already visible GUI on button click

我有点困惑为什么我的程序不工作。单击按钮时,我试图将图像添加到框架中。我已在 java 中验证该文件存在并且可以找到照片。我还验证了该按钮是否有效。但是当我编译并单击按钮时,它什么也不做……如果有人能指导我正确的方向,我将不胜感激。

package gamePractice;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class window {

    public static void main(String[] args){
        JFrame frame = new JFrame("ex");

        JPanel panel = new JPanel();
        JButton button = new JButton();
        button.setText("Press Me");

        panel.add(button);
        frame.add(panel);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        button.addActionListener(new ActionListener() {
               @Override
            public void actionPerformed(ActionEvent e) {
                     if(e.getSource() == button) {
                        ImageIcon img = new ImageIcon(getClass().getResource("t.jpg"));
                        JLabel stickLabel = new JLabel("yes", img, SwingConstants.CENTER);
                        JPanel panel2 = new JPanel();
                        panel2.add(stickLabel);
                        frame.add(panel2);
                      }
               }
         });
    }
}

您正在将组件添加到一个已经可见的容器中 - 您需要通过调用 revalidate 然后调用 repaint

LayoutManager 知道更改
panel2.add(stickLabel);
frame.add(panel2);
panel2.revalidate();
panel2.repaint();
  • JFrame uses BorderLayout(只能放置一个JComponentCENTER区域)
  • 你的ActionListenerJPanel panel = new JPanel();换成了JPanel panel2 = new JPanel();,那么JButton button = new JButton();就可以消失了,

然后有两个选项,注意JPanel uses FlowLayout

  1. (正确)将JLabel添加到JPanel,使用BorderLayoutLayoutManager更改为JPanel,加载ImageIcon 到局部变量,在 ActionListener 里面调用 JLabel.setText()JLabel.setIcon()

  2. (替换内容)调用revalidate();repaint();JFrame,但是JPanel panel = new JPanel();JButton button = new JButton();可以永远消失,