2015-09-24 4 views
1

Я работаю над назначением для класса, где нам нужно создать JComboBox, и каждый параметр открывает новое окно, в котором вы можете делать все, что хотите, в этих новых окнах. Пожалуйста, имейте в виду, что я очень новичок в GUI и новичок в Java в целом, если мои вопросы глупы.Очистить JPanel от JFrame

У меня есть вопрос и вопрос ...

Мой вопрос:
Когда пользователь выбирает опцию «Матрица» новое окно всплывает с цитатой и две кнопки. Сейчас у меня две панели JPanels (панель и панель2) добавляет цитату в позицию NORTH, а затем панель2 добавляет две кнопки в позицию CENTER с использованием BorderLayout. Мой вопрос заключается в том, что я делаю это правильно ... Могу ли я использовать только панель для добавления цитаты и кнопок или необходимо создать отдельные панели для отдельных элементов, добавляемых в JFrame? Когда я включил их в одну панель, цитата не была в окне, когда я запускал программу.

panel.add(matrixQuote); 
    newFrame.add(panel, BorderLayout.NORTH); 

Вот как у меня было, когда не отображались ^^^

Я ПОЛУЧИЛ ПРОБЛЕМУ С ОЧИСТКА JFrame FIXED
Я пытаюсь добавить ActionListener к BluePill и вместо того, чтобы открывать другое новое окно, мне показалось, что я могу очистить все из существующего окна, когда нажата кнопка, а затем отобразить что-то новое в указанном окне. Единственная информация, которую я мог найти на этом, - это то, как я ее использую в методе actionPerformed ниже. Я опубликую фрагмент того, о чем я говорю, ниже, а затем весь мой код ниже, на всякий случай.

Весь мой код ...

public class MultiForm extends JFrame{ 

    private JComboBox menu; 
    private JButton bluePill; 
    private JButton redPill; 
    private JLabel matrixQuote; 
    private int matrixSelection; 
    private JFrame newFrame; 
    private JPanel panel; 
    private JPanel panel2; 
    private static String[] fileName = {"", "The Matrix", "Another Option"}; 

public MultiForm() { 
    super("Multi Form Program");   
    setLayout(new FlowLayout()); 
    menu = new JComboBox(fileName); 
    add(menu); 

    TheHandler handler = new TheHandler(); 
    menu.addItemListener(handler); 

} 

public void matrixPanel() { 

    TheHandler handler = new TheHandler(); 
    //Create a new window when "The Matrix" is clicked in the JCB 
    newFrame = new JFrame(); 
    panel = new JPanel(); 
    panel2 = new JPanel(); 

    newFrame.setLayout(new FlowLayout()); 
    newFrame.setSize(500, 300); 
    newFrame.setDefaultCloseOperation(newFrame.EXIT_ON_CLOSE);  

    matrixQuote = new JLabel("<html>After this, there is no turning back. " 
      + "<br>You take the blue pill—the story ends, you wake up " 
      + "<br>in your bed and believe whatever you want to believe." 
      + "<br>You take the red pill—you stay in Wonderland, and I show" 
      + "<br>you how deep the rabbit hole goes. Remember: all I'm " 
      + "<br>offering is the truth. Nothing more.</html>"); 

    panel2.add(matrixQuote); 
    newFrame.add(panel2, BorderLayout.NORTH); 

    //Blue pill button and picture. 

    Icon bp = new ImageIcon(getClass().getResource("Blue Pill.png")); 
    bluePill = new JButton("Blue Pill", bp); 
    panel2.add(bluePill); 
    bluePill.addActionListener(handler); 

    //Red pill button and picture 
    Icon rp = new ImageIcon(getClass().getResource("Red Pill.png")); 
    redPill = new JButton("Red Pill", rp); 
    panel2.add(redPill); 

    newFrame.add(panel2, BorderLayout.CENTER);  
    newFrame.setVisible(true); 
} 

private class TheHandler implements ItemListener, ActionListener{ 

    public void itemStateChanged(ItemEvent IE) { 
     //listen for an item to be selected. 
     if(IE.getStateChange() == ItemEvent.SELECTED) { 
      Object selection = menu.getSelectedItem(); 

      if("The Matrix".equals(selection)) { 
       matrixPanel(); 
      } 
      else if("Another Option".equals(selection)) { 
      } 
     } 
    } 

    public void actionPerformed(ActionEvent AE) { 
     if(AE.getSource() == bluePill) { 
      newFrame.remove(panel);   
      newFrame.remove(panel2); 
      newFrame.repaint(); 
     } 
    } 
} 

//MAIN 
public static void main(String[] args) { 
    MultiForm go = new MultiForm(); 
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    go.setSize(400, 200); 
    go.setVisible(true); 
} 
} 

ответ

3

Вы можете использовать:

jpanel.removeAll(); 

Либо удалить определенную JComponent, используя JComponent себя как:

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(); 
frame.add(panel); 
frame.remove(panel); 
+0

вы правы, я починю – roeygol

+0

Ну я как бы был его противоположностью в моем коде, где я извлекая панель с newFrame ... newFrame.remove (панели); и он ничего не делал – NoobCoderChick

+0

Вот как у меня это в моем коде, но при нажатии кнопки ничего не удаляется. Или проблема заключается в том, как я написал действие? – NoobCoderChick

2

Используйте Card Layout. Вы можете менять панели по мере необходимости.

В учебнике приведен пример работы.

+0

Хорошо, я проверю это. Неужели CardLayout трудно учиться? Я даже не понимаю, что такое JPanel и BorderLayout. – NoobCoderChick

+0

Спасибо, Камикр, теперь я работаю, но я определенно буду смотреть на CardLayout и изменить его на это, если у меня будет время или если ничего больше для будущего! – NoobCoderChick

0
panel.getGraphics().clearRect(0, 0, panel.getWidth(), panel.getHeight());