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

Java 单击按钮将ImageIcon添加到已可见的GUI,java,image,swing,jframe,jpanel,Java,Image,Swing,Jframe,Jpanel,我有点困惑为什么我的程序不起作用。当我单击按钮时,我正在尝试将图像添加到帧中。我已经用java验证了文件存在,并且它可以找到照片。我还验证了按钮是否有效。但当我编译并点击按钮时,它什么也不做……如果有人能指引我正确的方向,我将不胜感激 package gamePractice; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import

我有点困惑为什么我的程序不起作用。当我单击按钮时,我正在尝试将图像添加到帧中。我已经用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);
                      }
               }
         });
    }
}

您正在将组件添加到一个已经可见的容器中-您需要调用
LayoutManager
,然后调用
revalidate
重新绘制

panel2.add(stickLabel);
frame.add(panel2);
panel2.revalidate();
panel2.repaint();
  • 使用(只有一个
    JComponent
    可以放置到
    中心
    区域)
  • 替换
    JPanel面板=新的JPanel()带有
    JPanel面板2=新的JPanel()
    ,然后
    JButton button=newjbutton()可以消失
然后有两个选项,注意使用

  • (正确)要将
    JLabel
    添加到
    JPanel
    ,请使用
    BorderLayout
    LayoutManager
    更改为
    JPanel
    ,将
    ImageIcon
    加载到局部变量,在
    ActionListener
    中调用
    JLabel.setxt()
    JLabel.setIcon()

  • (替换内容)调用
    revalidate()
    重新绘制()
    JFrame
    ,但是
    JPanel面板=新的JPanel()带有
    JButton按钮=新JButton()可以永远消失


  • 非常感谢你!工作完美,但JPanel面板=新JPanel();with JButton button=new JButton();可能永远消失,因为JFrame使用BorderLayout因为没有图像图标或文本且不可见的
    JLabel
    实际上是不可见的,所以最好将标签声明为类属性,并在帧初始化期间添加它。然后在
    actionPerformed(..)
    方法中,设置图标。虽然可以在运行时添加组件,但这并不是最理想的方法(尤其是在这种情况下)。