2015-04-16 161 views
0

我最近開發的軟件應用程序主要是非常基本的,而且我遇到了問題。

我正在開發的應用程序有許多不同的菜單和屏幕,我希望JFrame能夠在單擊按鈕時顯示。

由於這是大多數應用程序似乎要實現的功能,所以我可以看到令人驚訝的很少的信息,這讓我想知道我的方法是否完全關閉,但是是說明這種方法的一些示例代碼。

因此,我的問題是,a)什麼是實現這個目標的最佳方式,以及b)我現在的代碼有什麼問題?但前一個問題是最重要的。動態JFrame - 更改JFrame內容

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Demo { 
    JFrame frame; 
    JButton nextButton = new JButton ("Next Screen"); 

    public void setup() { 
     frame = new JFrame(); 
     frame.setVisible(true); 
     frame.add(new PanelOne()); 
     frame.pack(); 
    } 


    public class PanelOne extends JPanel { { 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     this.add(new JLabel("Label One")); 
     this.add(new JLabel("Label Two")); 
     this.add(new JLabel("Label Three")); 
     this.add(new JLabel("Label Four")); 
     this.add(new JLabel("Label Five")); 
     JButton button = new JButton("Next Screen"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       swapPanel(); 
      } 
     }); 
     this.add(button); 
    } } 
    public class PanelTwo extends JPanel {{ 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     this.add(new JButton("Button One")); 
     this.add(new JButton("Button Two")); 
     this.add(new JButton("Button Three")); 
     this.add(new JButton("Button Four")); 
     this.add(new JButton("Button Five")); 
    }} 


    protected void swapPanel() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       frame.removeAll(); 
       frame.add(new PanelTwo()); 
       frame.invalidate(); 
       frame.revalidate(); 

      } 

     }); 

    } 

    public static void main (String[] args) { 
     Demo demo = new Demo(); 
     demo.setup(); 
    } 
} 
+3

用於交換顯示組件,使用[CardLayout(https://開頭的文檔。 oracle.com/javase/tutorial/uiswing/layout/card.html)。另外,問題是什麼? – kiheru

+0

感謝您的回覆,我更明確地提出了我的問題。我在問什麼是實現我的目標的最好方法,並且如果可能的話,解釋我的方法出了什麼問題。 – quantum285

+0

可能的[重複](http://stackoverflow.com/q/5654926/230513)。 – trashgod

回答

3

以此作爲你的代碼.....

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Demo { 
    JFrame frame; 
    JButton nextButton = new JButton ("Next Screen"); 
    PanelOne p = new PanelOne(); 
    public void setup() { 
     frame = new JFrame(); 
     frame.setVisible(true); 

     frame.add(p); 
     frame.pack(); 
    } 


    public class PanelOne extends JPanel { { 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     this.add(new JLabel("Label One")); 
     this.add(new JLabel("Label Two")); 
     this.add(new JLabel("Label Three")); 
     this.add(new JLabel("Label Four")); 
     this.add(new JLabel("Label Five")); 
     JButton button = new JButton("Next Screen"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       swapPanel(); 
      } 
     }); 
     this.add(button); 
    } } 
    public class PanelTwo extends JPanel {{ 
     this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     this.add(new JButton("Button One")); 
     this.add(new JButton("Button Two")); 
     this.add(new JButton("Button Three")); 
     this.add(new JButton("Button Four")); 
     this.add(new JButton("Button Five")); 
    }} 


    protected void swapPanel() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 


       frame.remove(p); 
       frame.add(new PanelTwo()); 
       frame.invalidate(); 
       frame.revalidate(); 

      } 

     }); 

    } 

    public static void main (String[] args) { 
     Demo demo = new Demo(); 
     demo.setup(); 
    } 
} 

希望它能幫助....

+1

迷住了!做了一個微調,剛用過frame.remove(frame.getContentPane()。getComponent(0));因爲我總是有一個父JPanel傳遞給JFrame。 任何想法爲什麼frame.removeAll()不工作? – quantum285

+0

,因爲removeall()會刪除整個組件,並且您必須添加一個名稱的組件,以便稍後可以刪除它。 – CoderNeji

+0

非常感謝。如果你不介意,我還有一個問題。在我的例子中,我使用了SwingUtilities.invokeLater,但它似乎沒有它。爲了awt事件隊列的緣故,將它留在哪裏是一個好習慣? – quantum285