Cómo y dónde dibujar JPanels

Estoy escribiendo una pequeña aplicación en la que quiero una interfaz gráfica de usuario que divide una ventana en dos secciones, cada una de las cuales será controlada por un JPanel. Quiero agregar un campo de entrada y un conjunto de botones en el lado izquierdo. Tengo el codigo:

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

Sé que inputTextField funciona cuando no lo dibujo dentro de un JPanel, pero por alguna razón ninguno de los JPanel se dibuja en mi ventana. ¿Por qué es esto? ¿Los he agregado en el lugar equivocado? ¿Hay algo mal con el diseño que he seleccionado?

Gracias :)

Respuesta 1

De acuerdo, una letanía de problemas ...

JFrameusa un BorderLayoutvalor predeterminado, nunca parece cambiarlo, esto significa que cuando agrega leftPanely luego rightPanel, es el panel derecho el que está ganando y se muestra.

A continuación, la razón por la que no está viendo nada rightPaneles porque en realidad no le está agregando nada

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

Ambos bloques agregan componentes al leftPanel.

Lo que creo que quieres hacer, en el segundo bloque, es algo más como ...

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

Una vez que corrijo todos esos problemas, su código funciona

Ejemplo ejecutable ...

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);
  }
}
Respuesta: 2

Estoy trabajando en un juego de disparos para el proyecto de programación de mi escuela y utilizando la detección de colisiones con actores. más tarde me di cuenta de que necesitaba usar otro método que pueda devolver a todos los actores en un área ...

He estado tratando de desplegar un artefacto automáticamente durante semanas en Bintray y sincronizarlo con Maven Central, todo dentro del sistema de construcción Travis. Pude subir a Bintray, pero la sincronización a ...

Tengo un servidor RMI ejecutándose en el host local, exportando un objeto de tipo Mensaje: intente {MessageServer obj = new MessageServer (); Trozo de mensaje = (Mensaje) UnicastRemoteObject.exportObject (obj, ...

Quiero enviar un mensaje de notificación push a un dispositivo iPhone particular usando Java. No tengo idea de cómo hacer esto. He buscado en Google esto, me han sugerido usar la clase "PayLoad" pero no ...