2016-08-02 2 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 button = 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. (правильно), чтобы добавить JLabel к JPanel, изменить LayoutManager к JPanel с помощью BorderLayout, нагрузки ImageIcon к местной переменной, внутри ActionListener, чтобы позвонить JLabel.setText() и JLabel.setIcon()

  2. (замена содержания) называют revalidate(); и repaint(); к JFrame, но JPanel panel = new JPanel(); с JButton button = new JButton(); может навсегда пропадает,

+1

До голосования за первый подход. –

 Смежные вопросы

  • Нет связанных вопросов^_^