2016-08-02 71 views
2

对于为什么我的程序无法正常工作,我有点困惑。我正在尝试在单击按钮时将图像添加到框架中。我在java中验证过该文件存在,它可以找到照片。我也证实了这个按钮的作用。但是,当我编译并单击按钮时,它什么也不做......如果有人能指引我在正确的方向,那将是非常感谢。将ImageIcon添加到按钮单击中已经显示的GUI上

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); 
         } 
       } 
     }); 
    } 
} 

回答

2

您将组件添加到一个已经可见容器 - 你需要打电话让LayoutManager了解变化致电revalidate其次repaint

panel2.add(stickLabel); 
frame.add(panel2); 
panel2.revalidate(); 
panel2.repaint(); 
+0

非常感谢您!完美工作 –

+0

但JPanel面板=新JPanel();用JButton按钮= new JButton();可以永远消失,因为JFrame使用BorderLayout – mKorbel

+0

由于没有图像图标或文本且不可见的'JLabel'实际上是不可见的,因此将标签声明为类属性并在帧初始化期间添加它会更好。然后在'actionPerformed(..)'方法中设置图标。虽然在运行时添加组件是可能的,但它不是最理想的方式(尤其是在这种情况下)。 –

4
  • JFrame使用BorderLayout(只有一个JComponent可以放置到CENTER区域)
  • 您的ActionListener替换JPanel panel = new JPanel();JPanel panel2 = new JPanel();,然后JButton button = new JButton();可以自败,

则有两种选择,注意JPanel使用FlowLayout

  1. (正确)通过使用BorderLayout添加JLabelJPanel,改变LayoutManagerJPanel,负载ImageIcon到局部变量,里面的ActionListener来电JLabel.setText()JLabel.setIcon()

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

+1

为第一种方法投票。 –