Как разрешить кнопкам в одном классе устанавливать видимость других панелей в других классах? - PullRequest
1 голос
/ 16 января 2012

У меня небольшие проблемы с моим проектом.

У меня есть один класс - панель с 4 кнопками.

У меня есть 4 класса (пока только один), которые представляют собой панели с различными компонентами. Эти панели будут занимать одно место, и одновременно должна быть видна только одна панель.

Что я хочу сделать, так это управлять видимостью панелей с помощью соответствующей кнопки. Например, когда пользователь нажимает кнопку 1, должна отображаться панель 1, а при нажатии кнопки 2 появляется панель 2 и т. Д.

Я впервые работаю с графическим интерфейсом в Java, и любая помощь приветствуется.

Ответы [ 4 ]

6 голосов
/ 16 января 2012

Это варианты перед вами, (учитывая в порядке, я думаю, наиболее подходящий для вас)

  1. CardLayout

    Объект CardLayout является менеджером макета для контейнера. Он рассматривает каждый компонент в контейнере как карту. Одновременно видна только одна карта, и контейнер действует как стопка карт.

    для получения дополнительной информации см. Как использовать CardLayout

  2. JTabbedPane

    Компонент, который позволяет пользователю переключаться между группой компонентов, щелкая вкладку с заданным заголовком и / или значком

    для получения дополнительной информации см. Как использовать панели с вкладками

  3. JDialog (возможно, неокрашенный)

    для получения дополнительной информации см. Как создавать диалоги

4 голосов
/ 16 января 2012

CardLayout - лучший вариант для ваших требований.

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

1 голос
/ 17 января 2012

Как и в других ответах, в недавнем GUI, который я создал, я использовал CardLayout для выполнения этой задачи.

Решение простое: в вашем родительском JFrame есть одна панель, которая будет содержать CardLayout, и когда вы добавляете каждую панель, которую хотите показать, вы связываете с ней строку, чтобы вы могли получить ее позже, например:

panelManager.add(typeSelectionView, TYPEVIEW); 

Где panelManager - это моя JPanel, содержащая мой макет (который вы должны добавить до этого, чтобы использовать метод add ().

Убедитесь, что вы храните эти строки, которые идентифицируют ваши скрытые панели в той или иной форме, как я здесь с моими конечными переменными, и когда приходит время показать эту панель, которая скрыта в макете, просто вызовите:

cl.show(panelManager, newPanel);

Где, в моем случае, newPanel был рассчитан контроллером и передан в представление. Он использует финальные статические строки в классе представления.

0 голосов
/ 17 января 2012

Хотя 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 );
      }
    } );
  }
}
...