单击按钮时将 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(只能放置一个
JComponent
到CENTER
区域)
- 你的ActionListener把
JPanel panel = new JPanel();
换成了JPanel panel2 = new JPanel();
,那么JButton button = new JButton();
就可以消失了,
然后有两个选项,注意JPanel uses FlowLayout
(正确)将JLabel
添加到JPanel
,使用BorderLayout
将LayoutManager
更改为JPanel
,加载ImageIcon
到局部变量,在 ActionListener
里面调用 JLabel.setText()
和 JLabel.setIcon()
(替换内容)调用revalidate();
和repaint();
到JFrame
,但是JPanel panel = new JPanel();
和JButton button = new JButton();
可以永远消失,
我有点困惑为什么我的程序不工作。单击按钮时,我试图将图像添加到框架中。我已在 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(只能放置一个
JComponent
到CENTER
区域) - 你的ActionListener把
JPanel panel = new JPanel();
换成了JPanel panel2 = new JPanel();
,那么JButton button = new JButton();
就可以消失了,
然后有两个选项,注意JPanel uses FlowLayout
(正确)将
JLabel
添加到JPanel
,使用BorderLayout
将LayoutManager
更改为JPanel
,加载ImageIcon
到局部变量,在ActionListener
里面调用JLabel.setText()
和JLabel.setIcon()
(替换内容)调用
revalidate();
和repaint();
到JFrame
,但是JPanel panel = new JPanel();
和JButton button = new JButton();
可以永远消失,