如何允许一个类中的按钮设置其他类中其他面板的可见性?

时间:2012-01-16 04:11:26

标签: java swing jpanel visibility jbutton

我的项目遇到了一些麻烦。

我有一个类,它是一个显示4个按钮的面板。

我有4个类(目前只有一个)是显示各种组件的面板。这些面板占据一个空间,一次只能看到一个面板。

我想要做的是用各自的按钮控制面板的可见性。 例如,当用户点击button1时,应该出现panel1,当按下button2时,会出现panel2等。

这是我第一次使用java中的GUI,感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

这些是您之前的选项,(按照我认为最适合您的顺序给出)

  1. CardLayout

      

    CardLayout对象是容器的布局管理器。它将容器中的每个组件视为卡片。一次只能看到一张卡片,而容器就像一堆卡片一样。

    有关详细信息,请参阅How to Use CardLayout

  2. JTabbedPane

      

    一个组件,允许用户通过单击具有给定标题和/或图标的选项卡在一组组件之间切换

    有关详细信息,请参阅How to Use Tabbed Panes

  3. JDialog(也许是未修饰的)

    有关详细信息,请参阅How to Make Dialogs

答案 1 :(得分:4)

CardLayout是满足您要求的最佳选择。

http://www.java2s.com/Code/Java/Swing-JFC/CardLayoutDemo.htm

答案 2 :(得分:1)

与其他答案一样,在我最近创建的GUI中,我使用CardLayout来完成此任务。

解决方案很简单,在您的Parent JFrame中有一个面板,它将保存CardLayout,当您添加要显示的每个面板时,您将String与它关联,以便您可以在以后抓取它,例如:

panelManager.add(typeSelectionView, TYPEVIEW); 

其中panelManager是包含我的布局的JPanel(在此之前你必须添加它,这样你就可以使用这个add()方法。

确保您存储这些以某种形式识别隐藏面板的字符串,就像我在这里使用我的最终变量一样,当显示隐藏在布局中的此面板时,只需调用:

cl.show(panelManager, newPanel);

在我的情况下,newPanel由控制器计算并传递给视图。它使用视图类中的最终静态字符串。

答案 3 :(得分:0)

虽然已经提出了CardLayout,甚至已经提供了Swing教程的链接,但我将添加一些示例代码,使用CardLayout作为答案。

public class CardLayoutDemo {

  private static JFrame createGUI(){

    JFrame testFrame = new JFrame(  );
    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

    List<String> layoutConstraints = Arrays.asList( "first", "second", "third");

    final JPanel contentsPane = new JPanel(  );
    final CardLayout cardLayout = new CardLayout(  );
    contentsPane.setLayout( cardLayout );

    //listener which will be used to switch between the different layouts
    ActionListener listener = new ActionListener() {
      public void actionPerformed( ActionEvent aActionEvent ) {
        String constraint = aActionEvent.getActionCommand();
        cardLayout.show( contentsPane, constraint );
      }
    };

    //add components to card layout with specific constraint
    for ( String constraints : layoutConstraints ) {
      contentsPane.add( new JLabel( constraints ), constraints );
    }

    //create buttons allowing to switch between the different layouts
    JPanel buttonPanel = new JPanel();
    for ( int i = 0; i < layoutConstraints.size(); i++ ) {
      String constraint = layoutConstraints.get( i );
      JButton button = new JButton( "Layout " + i);
      button.setActionCommand( constraint );
      button.addActionListener( listener );
      buttonPanel.add( button );
    }

    testFrame.add( contentsPane, BorderLayout.CENTER );
    testFrame.add( buttonPanel, BorderLayout.SOUTH );

    return testFrame;
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      public void run() {
        JFrame frame = createGUI();
        frame.pack();
        frame.setVisible( true );
      }
    } );
  }
}