2012-01-30 105 views
0

我点击一个按钮来更改right_pan(JPanel)的内容时出现问题,什么也没有发生; 我有3个JPanel: 其中pan_glob位于另外两个: right_pan和left_pan(都集成到主要的JFrame中,名为“main”参见截图),另一个名为cree_client的外部JPanel(包含文本框)。在JPanel之间导航?

enter image description here

我想,当我点击一个按钮,cree_client的内容(JPanel中)被加载到right_pan(JPanel中)。

我试过,但它不工作:

private void jMenuItem23ActionPerformed(java.awt.event.ActionEvent evt) { 

    cree_client cc=new cree_client(); 
    this.right_pan.removeAll(); 
    this.right_pan.validate(); 
    this.right_pan.add(cc); 
    this.right_pan.revalidate(); 

}

任何帮助?

+0

'jMenuItem23' ?!! – millimoose 2012-01-30 20:55:28

+0

它是由netbeans生成的名称不是问题,这个名称对我来说是抽象的,不会引起后顾之忧.. – 2012-01-30 21:55:03

回答

2

使用任何UI工具包的首要规则:不要删除/添加子项来控制可见性。几乎所有的UI工具包都不能很好地工作。它需要更多的工具来正确处理它,而这对于Swing来说是双倍的。取而代之的是使用可见性,或者我敢打赌你应该使用的是CardLayout。用CardLayout小组将让你几个屏幕间切换:

public class StackPanel extends JPanel { 

    CardLayout layout = new CardLayout(); 
    public StackPanel() { 
     super(); 
     setLayout(layout); 
    } 

    public addStack(String name, JComponent child) { 
     add(name, child); 
    } 

    public void showStack(String name) { 
     layout.show(this, name); 
    } 
} 


CardLayout layout = new CardLayout(); 
StackPanel stack = new StackPanel(); 
stack.addStack("panelOne", panelOne); 
stack.addStack("panelTwo", panelTwo); 
... 
JButton someButton = new JButton(new AbstractAction("Next") { 
    public void actionPerformed(ActionEvent evt) { 
     stack.showStack("panelTwo"); 
    } 
}); 

如果你不希望两个或多个屏幕之间翻转,那么你可以使用setVisible()隐藏和显示不同的屏幕一样好。

+0

感谢您的回复,我目前在netbeans(使用设计者),它自动集成了“GroupLayout”作为默认布局,编写这样的应用程序非常漫长而乏味,所以我使用netbeans的设计器。任何解决方案 – 2012-01-30 21:05:57

+1

你可以在每个面板上使用setVisible(),如果它们在GroupLayout中,它会像CardLayout一样恰当地隐藏/显示那些。不同的是,CardLayout只会在GroupLayout允许您显示多个的时间显示一个孩子。这取决于你的视觉布局,我怀疑使用CardLayout对于你的用户,UX等会更容易,但这取决于你。 – chubbsondubs 2012-01-30 21:35:15

+0

好的,我会尝试setVisible(),我在测试后回来... – 2012-01-30 21:53:16

0

首先,你真的检查过你的动作监听器中的代码是否正在执行?我没那么熟悉JMenu秒,但我认为这种方法应该更像

public void ActionPerformed(ActionEvent evt){...} 

和动作监听者应加JMenuItem本身 - 快速System.out.println()语句执行的动作方法的主体应该帮助您可以确定是否更改JPanel的代码正在执行!其次,如果您的actionPerformed方法正在运行,您可能需要在重新验证后尝试运行Component.repaint()方法。此外,它可能是一个想法,试图“重新验证”和“重新绘制”主要JPanel,其中包含您正在更改的JPanel(在您的情况下为right_pan的父项)!

+0

谢谢你的回复,是的,我已经测试过,它的工作原理,Component.repaint()重新验证后不工作......无论如何感谢您 – 2012-01-30 20:55:35

+0

您是否尝试重新绘制并重新验证您添加'right_pan'的JPanel? – Andy 2012-01-30 21:02:25

+0

是的,但它不起作用(看第一个问题),我已经写了代码^^谢谢.. – 2012-01-30 21:14:56