Как и где рисовать JPanels - PullRequest
0 голосов
/ 28 ноября 2018

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

public ModalModeller() {
    super("Modal Modeller"); 
    //setLayout(new GridBagLayout());
    setSize(1000, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    font = new Font("Sans-serif", Font.PLAIN, 20);
    setUpTextInputField();
    setUpButtons();
    setUpPanels();
    setVisible(true);
}
public void setUpTextInputField() {
    inputField = new JTextField(30);
    inputField.addActionListener( // anonymous inner class
            new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String s = inputField.getText();
                    ExprStr inputExpression = new ExprStr(s);
                    System.out.println(s);
                }
            });
    //add(inputField);
}
public void setUpButtons() {
    buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridBagLayout());
    GridBagConstraints buttonConstraints = new GridBagConstraints();
    buttonConstraints.gridx = 0;
    buttonConstraints.gridy = GridBagConstraints.RELATIVE;
    buttonConstraints.anchor = GridBagConstraints.WEST;

    reflexB = new JRadioButton();
    reflexB.addActionListener(this);
    reflexB.setFont(font);

    transB = new JRadioButton();
    transB.addActionListener(this);
    transB.setFont(font);

    symmB = new JRadioButton();
    symmB.addActionListener(this);
    symmB.setFont(font);

    hereditaryB = new JRadioButton();
    hereditaryB.addActionListener(this);
    hereditaryB.setFont(font);

    buttonPanel.add(reflexB);
    buttonPanel.add(transB);
    buttonPanel.add(symmB);
    buttonPanel.add(hereditaryB);


}
public void setUpPanels() {
    leftPanel = new JPanel();
    rightPanel = new JPanel();
    leftPanel.setLayout(new GridBagLayout());
    rightPanel.setLayout(new GridBagLayout());

    leftPanel.setBackground(Color.black);


    GridBagConstraints leftConstraints = new GridBagConstraints();
    GridBagConstraints rightConstraints = new GridBagConstraints();

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 0;
    leftConstraints.gridy = 0;
    leftPanel.add(inputField, leftConstraints);

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 1;
    leftConstraints.gridy = 0;
    leftPanel.add(buttonPanel, leftConstraints);
    add(leftPanel);
    add(rightPanel);
}

Я знаю, что inputTextField работает, когда я не рисую его в JPanel, но по какой-то причине ни один из JPanels не рисуется в моем окне.Почему это?Я добавил их в неправильном месте?Что-то не так с выбранным макетом?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

но по какой-то причине ни один из JPanels не рисуется в моем окне

Не уверен, почему они оба не отображаются, но я знаю, почему левая панель не отображается.

Из того, что я могу вам сказать, вы используете JFrame.Менеджер по умолчанию для JFrame - BorderLayout.Вы пытаетесь добавить две панели к фрейму, используя:

add(leftPanel);
add(rightPanel);

Однако, когда вы добавляете компоненты в BorderLayout и не указываете ограничение, компонент добавляется в CENTER.Однако в CENTER можно добавить только один компонент, поэтому BorderLayout управляет только последним добавленным компонентом.

Мне нужен графический интерфейс, который разбивает окно на две секции

Поэтому вместо структурирования вашего кода на основе всей создаваемой панели я бы структурировал код на основе панелей, которые вы хотите добавить в фрейм.

Таким образом, код в вашем конструкторе будет выглядеть примерно так:

add(createLeftPane(), BorderLayout.LINE_START);
add(createCenterPanel(), BorderLayout.CENTER);

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

Тогда код может выглядеть примерно так:

private JPanel createLeftPanel()
{
    JPanel panel = new JPanel();
    panel.add( new JButton("Left Panel Button") );
    return panel;
}

Вы быДобавьте аналогичный код для метода createCenterPanel().

Затем, когда у вас появятся две панели верхнего уровня, вы можете добавить свой реальный компонент к каждой панели, используя любой менеджер раскладки, который вы хотите использовать.

Дизайн формы должен быть итеративным.

0 голосов
/ 28 ноября 2018

Хорошо, множество проблем ...

JFrame использует BorderLayout по умолчанию, вы никогда не меняете его, это означает, что когда вы добавляете leftPanel, а затем rightPanel, это правая панель, которая выигрывает и отображается.

Далее, причина, по которой вы ничего не видите на rightPanel, заключается в том, что вы на самом деле ничего не добавляете к нему

leftConstraints.fill = GridBagConstraints.BOTH;
leftConstraints.gridx = 0;
leftConstraints.gridy = 0;
leftPanel.add(inputField, leftConstraints);

leftConstraints.fill = GridBagConstraints.BOTH;
leftConstraints.gridx = 1;
leftConstraints.gridy = 0;
leftPanel.add(buttonPanel, leftConstraints);

Оба эти блока добавляют компоненты к leftPanel.

То, что вы хотите сделать во втором блоке, напоминает ...

rightConstraints.fill = GridBagConstraints.BOTH;
rightConstraints.gridx = 1;
rightConstraints.gridy = 0;
rightPanel.add(buttonPanel, leftConstraints);

Как только я исправлю все эти проблемы, ваш код заработает

Пример запуска ...

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class ModalModeller extends JFrame {

  public static void main(String[] args) {
    new ModalModeller();
  }

  private JTextField inputField;
  private JPanel buttonPanel;
  private JRadioButton reflexB;
  private JRadioButton transB;
  private JRadioButton symmB;
  private JRadioButton hereditaryB;
  private JPanel leftPanel;
  private JPanel rightPanel;

  public ModalModeller() {
    super("Modal Modeller");
    setLayout(new GridLayout(0, 2));
    setSize(1000, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setUpTextInputField();
    setUpButtons();
    setUpPanels();

    setVisible(true);
  }

  public void setUpTextInputField() {
    inputField = new JTextField(30);
    inputField.addActionListener( // anonymous inner class
            new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String s = inputField.getText();
//      ExprStr inputExpression = new ExprStr(s);
        System.out.println(s);
      }
    });
    //add(inputField);
  }

  public void setUpButtons() {
    buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridBagLayout());
    GridBagConstraints buttonConstraints = new GridBagConstraints();
    buttonConstraints.gridx = 0;
    buttonConstraints.gridy = GridBagConstraints.RELATIVE;
    buttonConstraints.anchor = GridBagConstraints.WEST;

    reflexB = new JRadioButton();
//  reflexB.addActionListener(this);

    transB = new JRadioButton();
//  transB.addActionListener(this);

    symmB = new JRadioButton();
//  symmB.addActionListener(this);

    hereditaryB = new JRadioButton();
//  hereditaryB.addActionListener(this);

    buttonPanel.add(reflexB);
    buttonPanel.add(transB);
    buttonPanel.add(symmB);
    buttonPanel.add(hereditaryB);

  }

  public void setUpPanels() {
    leftPanel = new JPanel();
    rightPanel = new JPanel();
    leftPanel.setLayout(new GridBagLayout());
    rightPanel.setLayout(new GridBagLayout());

    leftPanel.setBackground(Color.black);

    GridBagConstraints leftConstraints = new GridBagConstraints();
    GridBagConstraints rightConstraints = new GridBagConstraints();

    leftConstraints.fill = GridBagConstraints.BOTH;
    leftConstraints.gridx = 0;
    leftConstraints.gridy = 0;
    leftPanel.add(inputField, leftConstraints);

    rightConstraints.fill = GridBagConstraints.BOTH;
    rightConstraints.gridx = 1;
    rightConstraints.gridy = 0;
    rightPanel.add(buttonPanel, leftConstraints);
    add(leftPanel);
    add(rightPanel);
  }
}
...