在JPanels之间导航?

时间:2012-01-30 19:58:38

标签: java swing jframe jpanel

当我点击按钮更改right_pan(JPanel)的内容时,我遇到了问题; 我有3个JPanel:   另外两个是pan_glob:   right_pan和left_pan(集成到主JFrame中,名为“main”,见截图),另一个外部JPanel名为cree_client(包含文本框)。

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();

}

有什么帮助?

2 个答案:

答案 0 :(得分: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()隐藏并显示不同的屏幕。

答案 1 :(得分:0)

首先,您是否确实检查过您的动作监听器中的代码是否正在执行?我对JMenu并不熟悉,但我认为该方法应该更像

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

并且应该将动作侦听器添加到JMenuItem本身 - 动作执行方法体内的快速System.out.println()语句应该可以帮助您确定更改JPanel的代码是否正在执行!

其次,如果您的actionPerformed方法正在运行,您可能需要在重新验证后尝试运行Component.repaint()方法。此外,可能需要尝试“重新验证”和“重新绘制”主要JPanel(包含您正在更改的那个)(在您的情况下是right_pan的父级)!