2015-04-16 147 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