2012-10-28 32 views
3

我不幸的是不得不在這個程序中使用多個窗口,我不認爲CardLayout會工作,因爲在不同的佈局之間我不能有任何按鈕。所以我試圖編寫一個按鈕來隱藏當前的JPanel(thePanel)並顯示一個新的(thePlacebo)。如何隱藏當前的JPanel並在Java中使用按鈕顯示新的JPanel?

我試圖隱藏thePanel在這樣一個ActionListener:

frame.getContentPane().remove(thePanel); 

我想這會工作,但它只是當我按下按鈕凍結我的程序。

這裏的上下文的代碼塊:

public class Reflexology1 extends JFrame{ 
JButton button1, button2; 
JButton movingButton; 
JTextArea textArea1; 
int buttonAClicked, buttonDClicked; 
private long _openTime = 0; 
private long _closeTime = 0; 
JPanel thePanel = new JPanel(); 
JPanel thePlacebo = new JPanel(); 
final JFrame frame = new JFrame("Reflexology"); 

public static void main(String[] args){ 
    new Reflexology1(); 
} 

public Reflexology1(){ 


    frame.setSize(600, 475); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setTitle("Reflexology 1.0"); 
    frame.setResizable(false); 


    button1 = new JButton("Accept"); 
    button2 = new JButton("Decline"); 
    movingButton = new JButton("Click Me"); 

    ListenForAcceptButton lForAButton = new ListenForAcceptButton(); 
    ListenForDeclineButton lForDButton = new ListenForDeclineButton(); 
    button1.addActionListener(lForAButton); 
    button2.addActionListener(lForDButton); 
    //movingButton.addActionListener(lForMButton); 

    JTextArea textArea1 = new JTextArea(24, 50); 

    textArea1.setText("Tracking Events\n"); 
    textArea1.setLineWrap(true); 
    textArea1.setWrapStyleWord(true); 
    textArea1.setSize(15, 50); 

    FileReader reader = null; 
    try { 
     reader = new FileReader("EULA.txt"); 
     textArea1.read(reader, "EULA.txt"); 
    } catch (IOException exception) { 
     System.err.println("Problem loading file"); 
     exception.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
      } catch (IOException exception) { 
       System.err.println("Error closing reader"); 
       exception.printStackTrace(); 
      } 
     } 
    } 

    JScrollPane scrollBar1 = new JScrollPane(textArea1, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    AdjustmentListener listener = new MyAdjustmentListener(); 

    thePanel.add(scrollBar1); 
    thePanel.add(button1); 
    thePanel.add(button2); 
    thePlacebo.add(movingButton); 

    frame.add(thePanel); 

    ListenForWindow lForWindow = new ListenForWindow(); 
    frame.addWindowListener(lForWindow); 
    frame.setVisible(true); 

} 
// Implement listeners 

private class ListenForAcceptButton implements ActionListener{ 
    public void actionPerformed(ActionEvent e){ 
     if (e.getSource() == button1){ 
      Calendar ClCDateTime = Calendar.getInstance(); 
      System.out.println(ClCDateTime.getTimeInMillis() - _openTime); 
      _closeTime = ClCDateTime.getTimeInMillis() - _openTime; 
      frame.getContentPane().remove(thePanel); 
     } 
    } 
} 

有誰知道我可能是做錯了什麼?

回答

6

從容器中移除組件後,它將進入invalidate狀態。要回到valid狀態,你必須revalidaterepaint

frame.revalidate(); // For Java 1.7 or above 
frame.getContentPane().validate(); // For Java 1.6 or below 
frame.repaint(); 

這是對你的幫助一個工作示例:

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

public class Assignment 
{ 
    private JFrame frame; 
    private JPanel firstPanel; 
    private JPanel secondPanel; 

    private JButton forwardButton; 
    private JButton backButton; 

    private void displayGUI() 
    { 
     frame = new JFrame("Assignment"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     firstPanel = new JPanel(); 
     firstPanel.setOpaque(true); 
     firstPanel.setBackground(Color.BLUE); 

     secondPanel = new JPanel(); 
     secondPanel.setOpaque(true); 
     secondPanel.setBackground(Color.RED); 

     forwardButton = new JButton("Forward"); 
     forwardButton.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       frame.remove(firstPanel); 
       frame.add(secondPanel); 
       frame.revalidate(); // For Java 1.7 or above. 
       // frame.getContentPane().validate(); // For Java 1.6 or below. 
       frame.repaint(); 
      } 
     }); 

     backButton = new JButton("Back"); 
     backButton.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent ae) 
      { 
       frame.remove(secondPanel); 
       frame.add(firstPanel); 
       frame.revalidate(); // For Java 1.7 or above. 
       // frame.getContentPane().validate(); // For Java 1.6 or below. 
       frame.repaint(); 
      } 
     }); 

     firstPanel.add(forwardButton); 
     secondPanel.add(backButton); 

     frame.add(firstPanel); 
     frame.setSize(300, 300); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Assignment().displayGUI(); 
      } 
     }); 
    } 
} 
在你的情況你這麼直接依賴於Java版本,你可以做到這一點從 JFrame添加/刪除組件
4
  1. 正確的方法可能是(只)通過使用CardLayout

  2. 否則必須從容器中取出JPanel和調用(如最後一行代碼和容器中的所有更改完成後調用只有一個次)

myJPanelsContainer#revalidate(); // in Java6 for JFrame validate() 
myJPanelsContainer#repaint();