Четыре панели в рамке с разным расположением

Я пытаюсь разработать интерфейс с 4 разными панелями в одном кадре. Я включил 2 описания панелей в приведенный ниже код.

Ниже приведена часть моего кода:

public class finalFrame extends JFrame {
       PanelA a = new PanelA()
       PanelB b = new PanelB()
       // ...
      public finalFrame() {
          super();
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          //...
          //...
          //...
          add(a);
          add(b);
          } 
}
class PanelA extends JPanel {
      JButton bt = new JButton();
      add(bt);
     //...
  }

class PanelB extends JPanel {
// ...
//... }

class Program {
      public static void main(String [] args) {
            finalFrame fr = new finalFrame();
      }
 }

Этот код, похоже, не работает (он отображает только последнюю панель нечетного размера (не то, что я хотел)). Тем не менее, когда я настраиваю разные панели ВНУТРИ класса фрейма (а не отдельных классов панелей), все работает отлично. Почему я не могу использовать разные классы панелей, а затем просто добавить их все в окончательный класс Frame?

Кроме того (извините за все вопросы), если я включу панель, настроенную в класс фрейма, и включу макет фрейма, тогда это сработает (как я только что упомянул). Однако, если я включаю панель, настроенную в класс фрейма, но НЕ включаю макет фрейма, то отображается только последняя панель, использующая макет фрейма. Почему он не изображает ни одну из других панелей??

Спасибо!!


person vmck    schedule 27.02.2014    source источник


Ответы (2)


Вы должны сначала сделать свой Фрейм, Который содержит по крайней мере четыре JPanel в вашем случае. Используйте GridLayout изучить некоторые, затем сделайте каждую панель отдельно и добавьте в JFrame что-то вроде этого:

frame.setLayout(new GridLayout(2,2));
frame.add(new Panel2().getPanel());
frame.add(new Panel2().getPanel());
frame.add(new Panel3().getPanel());
frame.add(new Panel4().getPanel());
frame.setSize(100,100);
frame.setVisible(true);
person Sarz    schedule 27.02.2014
comment
Нет необходимости делать getPanel(), если Panel2, Panel3 и т. д. равны JPanel. - person Aman Agnihotri; 27.02.2014
comment
is new Panel2() конструктор означает отсутствие возвращаемого типа, getPanel() это метод, который возвращает JPanel.. . мы крутые? @AwfullyAwesome - person Sarz; 27.02.2014
comment
Ну, я говорил только в контексте конструкторов. Если Panel2() является constructor, вам не нужно добавлять метод getPanel(). Проверьте это в IDE, чтобы увидеть, если вы мне не верите. :) - person Aman Agnihotri; 27.02.2014
comment
Container.add(String,Component) is not applicable argument mismatch для this.add( new Panel(),BorderLayout.NORTH);, где нет ошибки для this.add( new Panel().getPanel(),BorderLayout.NORTH); Пожалуйста, можете ли вы показать какой-либо пример - person Sarz; 27.02.2014
comment
Я понимаю, поэтому я также голосую за вас, и в более старой версии JDK 4 или 5 JFrame Layout по умолчанию был FlowLayout, изученный еще в колледже, я помню это :):) - person Sarz; 28.02.2014
comment
Вау.. :D Самый ранний из JDK, с которого я начал, был версией 1.4. Думаю, я начал свой материал Swing с JDK 6, поэтому не знаю, был ли это FlowLayout для JFrame. Тем не менее, в JPanels по умолчанию используется FlowLayout. :) - person Aman Agnihotri; 28.02.2014

По умолчанию Frames в Java имеет BorderLayout в качестве LayoutManager.

Итак, чтобы добавить любой panel к Frame, вы можете сделать следующее:

frame.add(panel, BorderLayout.NORTH);
frame.add(panel, BorderLayout.WEST);
frame.add(panel, BorderLayout.SOUTH);
frame.add(panel, BorderLayout.EAST);
frame.add(panel, BorderLayout.CENTER);

Эти значения работают и действительны. Если вы используете 4 разных места сверху для своих четырех разных панелей при добавлении их в фрейм, тогда ваши панели будут видны.

Вот демонстрация добавления четырех панелей с помощью GridLayout:

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GridFrame extends JFrame
{
  private static final long serialVersionUID = 1L;

  public GridFrame()
  {
    super("Grid Demo");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new GridLayout(2, 2));

    add(new PanelA());
    add(new PanelB());
    add(new PanelC());
    add(new PanelD());

    setSize(500, 500);
    setLocationRelativeTo(null);
    setVisible(true);
  }

  public static void main(String[] args)
  {
    // Call Swing stuff like this, since Swing is not thread safe.
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        new GridFrame();
      }
    });
  }
}

class PanelA extends JPanel
{
  private static final long serialVersionUID = 1L;

  public PanelA()
  {
    setBackground(Color.RED);
  }
}

class PanelB extends JPanel
{
  private static final long serialVersionUID = 1L;

  public PanelB()
  {
    setBackground(Color.BLUE);
  }
}

class PanelC extends JPanel
{
  private static final long serialVersionUID = 1L;

  public PanelC()
  {
    setBackground(Color.YELLOW);
  }
}

class PanelD extends JPanel
{
  private static final long serialVersionUID = 1L;

  public PanelD()
  {
    setBackground(Color.GREEN);
  }
}
person Aman Agnihotri    schedule 27.02.2014
comment
По умолчанию граница JFrame равна FlowLayout . не так ли? - person Sarz; 27.02.2014
comment
Граница JFrame как FlowLayout? По умолчанию LayoutManager JFrame равен BorderLayout. В документации сказано: На панели контента по умолчанию будет установлен менеджер BorderLayout. и поскольку метод add() в JFrame теперь напрямую добавляет components к content pane, он работает. Это не FlowLayout. - person Aman Agnihotri; 27.02.2014
comment
почему отображается только последняя панель, которую я добавляю? Это связано с макетом кадра по умолчанию? - person vmck; 27.02.2014
comment
Если это ваш код, о котором вы говорите, то да. Когда вы делаете add(a);, рамка добавляет компонент a в center, затем, когда вы делаете add(b);, рамка снова добавляет компонент в центр, эффективно закрывая ранее добавленные компоненты. Используйте подсказки макета, как показано выше, в моем коде, и вы сможете легко решить проблему. - person Aman Agnihotri; 27.02.2014
comment
@vmck: Вы можете проверить демо-код в моем обновленном ответе для получения дополнительной информации. :) - person Aman Agnihotri; 27.02.2014
comment
@AwfullyAwesome вау, это так много проясняет, спасибо! Я думал, что макет по умолчанию для фреймов — GridLayout. Но спасибо! :) - person vmck; 28.02.2014
comment
Рад, что смог помочь. :) - person Aman Agnihotri; 28.02.2014