2015-01-21 5 views
1

Я пытаюсь сделать так, чтобы у меня две панели в рамке. Один показывает 4 карты, а другой - кнопку. При нажатии кнопки четыре карты выбираются случайным образом. Карты не отображаются, когда я инициализирую программу или когда я нажимаю кнопку «Обновить». Может ли кто-нибудь объяснить, что я делаю неправильно, и что мне нужно сделать, чтобы исправить это?Компоненты JPanel исчезают после попытки их обновления

Вот мой код

import java.awt.event.*; 
import javax.swing.*; 
import java.awt.*; 

public class MyFrame extends JFrame{ 

    public MyFrame(){ 
     super("Random Cards"); 
     CardPanel cardPanel = new CardPanel(); 
     JPanel buttonPanel = new JPanel(); 
     JButton jbtRefresh = new JButton("Refresh"); 
     buttonPanel.add(jbtRefresh); 
     add(cardPanel, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.SOUTH); 

     jbtRefresh.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       cardPanel.refresh(); 
      } 
     }); 
    } 

    public static void main(String[] args){ 
     MyFrame f = new MyFrame(); 
     f.setDefaultCloseOperation(MyFrame.EXIT_ON_CLOSE); 
     f.setSize(500, 300); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public class CardPanel extends JPanel{ 
     JLabel l1; 
     JLabel l2; 
     JLabel l3; 
     JLabel l4; 

     void CardPanel(){ 
      refresh(); 
     } 

     void refresh(){ 
      l1 = new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png")); 
      l2 = new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png")); 
      l3 = new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png")); 
      l4 = new JLabel(new ImageIcon("image/card/" + (int)(1 + Math.random() * 54) + ".png")); 
      removeAll(); 
      add(l1); 
      add(l2); 
      add(l3); 
      add(l4); 
      repaint(); 
     } 
    } 
} 
+0

Вы не сможете получить доступ к переменной 'cardPanel' в' ActionListener'. Для этого 'cardPanel' должен быть' final' – Titus

+0

Что вы говорите? 'final' - постоянный модификатор. –

+0

@Malik Brahimi Он пытается получить доступ к переменной в «анонимном внутреннем классе». Для этого переменная должна быть «final» – Titus

ответ

1

Короткий ответ

Вызов revalidate перед тем repaint при вызове refresh ...

дольше, более правильный ответ

C onsider, используя вместо этого CardLayout. См How to Use CardLayout для более подробной информации

Также ...

  • Убедитесь, что вы создаете/изменения вы УИ только в контексте событий Диспетчерская тему см Initial Threads для получения более подробной информации.
  • Вы можете подумать о создании класса Card, который простирается от чего-то вроде JPanel, который несет ответственность за показ определенной карты. Таким образом, вы можете просто вычислить нужные значения случайных карт и постоянно обновлять ранее существовавшие экземпляры, а не создавать новые экземпляры каждый раз. Как правило, он будет работать быстрее и быть более ЭФФЕКТИВНАЯ

Nit выбрать: Следует избегать растягивания ваш UI можно прямо из контейнеров верхнего уровня, как JFrame, они, как правило, чтобы заблокировать вас в одном прецеденте и сделать его трудно повторного использования или расширения в будущем. Вы все равно не добавляете никаких новых функциональных возможностей в кадр

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