es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Posicionando componentes en java GridBagLayout

Soy un traductor de español que traduce documentos de IT. Traduce lo siguiente al español. No traduzcas el código y la salida en markdown

Soy relativamente nuevo en Java y estoy haciendo una aplicación que me ayuda a estimar los costos de construcción. Construí el backend para ello, pero los botones y campos de texto estaban todos en una fila, haciendo que la aplicación fuera tan ancha que no cabía en mi pantalla. Ahora estoy intentando usar un diseño de cuadrícula 3×6 para organizar los componentes de la siguiente manera:

Título

pregunta1 respuesta
pregunta2 respuesta
pregunta3 respuesta
pregunta4 respuesta
–Calcular–
Estimado: $***

Cuando corro el programa, me da un “posición ilegal del componente” error (pegado en la parte inferior) y ya no aparece nada desde que empecé a agregar las restricciones de rejilla. El problema no está en el JButton ni en su action listener. Aquí está el código, lo siento por la falta de comentarios:

import java.util.<em>;
import packagepackage.HintTextFieldUI;
import java.awt.</em>;
import java.awt.event.*;
import java.security.PublicKey;

import javax.swing.*;
import javax.swing.text.JTextComponent;
public class CP_GUI extends JFrame {

public JLabel tLabel;

public JTextField linear;
public JLabel liLabel;

public JComboBox<String> sump;
   public JLabel suLabel;

public JComboBox<String> elec;
   public JLabel elLabel;

public JTextField prep;
public JLabel prLabel;

public JTextField estimate;
   public JLabel esLabel;

 public CP_GUI() {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    panel.setLayout(new GridBagLayout());
    panel.setBorder(BorderFactory.createEmptyBorder(200, 200, 100, 100));
    GridBagConstraints c = new GridBagConstraints();

    String title = "Calculadora de Tubos de Drenaje";
    tLabel = new JLabel(title);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.ipady = 40;
    c.gridwidth = 3;
    c.gridx = 0;
    c.gridy = 0;
    panel.add(tLabel, c);
    frame.setTitle(title);

    liLabel = new JLabel("Longitud del perímetro del sótano");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridy = 0;
    panel.add(liLabel, c);
    linear = new JTextField(10);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridy = 1;
    panel.add(linear, c);

    prLabel = new JLabel("Tiempo necesario para preparar el sitio:");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 2;
    c.gridy = 0;
    panel.add(prLabel, c);
    prep = new JTextField(10);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 2;
    c.gridy = 1;
    panel.add(prep, c);

    suLabel = new JLabel("Usando:");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 3;
    c.gridy = 0;
    panel.add(suLabel, c);
    String[] sumpo = {"Nueva bomba sumidero","Bomba sumidero existente"};
    sump = new JComboBox<>(sumpo);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 3;
    c.gridy = 1;
    panel.add(sump, c);

    elLabel = new JLabel("Ubicación del tomacorriente eléctrico:");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 4;
    c.gridy = 0;
    panel.add(elLabel, c);
    String[] electo = {"No hay un tomacorriente dentro de 6 pies de la bomba sumidero","Hay un tomacorriente cercano o no necesito una bomba nueva"};
    elec = new JComboBox<>(electo);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 4;
    c.gridy = 1;
    panel.add(elec, c);

    estimate = new JTextField(10);

    JButton calculate = new JButton("Calcular");
    calculate.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event){
            // TODO Auto-generated method stub
            Integer linVar = Integer.parseInt(linear.getText());
            linVar *= 13;

            Object sumps = sump.getSelectedItem();
            Integer sumpVar = 0;
            if("Nueva bomba sumidero".equals(sumps)) {
                sumpVar += 260;}

            Object elecs = elec.getSelectedItem();
            Integer elecsVar = 0;
            if("No hay un tomacorriente dentro de 6 pies de la bomba sumidero".equals(elecs)) {
                elecsVar += 280;}

            Integer prepsVar = Integer.parseInt(prep.getText());
            prepsVar += 30;
            prepsVar *= 235;
            prepsVar /= 100;

            linVar += sumpVar += elecsVar += prepsVar;
            /* overhead*/
            linVar += 2428;
            /* tax */
            linVar *= 11;
            linVar /= 10;
            /* margin */
            linVar *= 12;
            linVar /= 10;
            String toWords = String.valueOf(linVar);

                estimate.setUI(new HintTextFieldUI(toWords, true));
                }

    });
    c.fill = GridBagConstraints.HORIZONTAL;
    c.ipady = 40;
    c.weightx = 0.5;
    c.gridwidth = 3;
    c.gridx = 5;
    c.gridy = 0;
    panel.add(calculate, c);

    esLabel = new JLabel("Costo estimado:");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridwidth = 2;
    c.gridx = 6;
    c.gridy = 0;
    panel.add(esLabel, c);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 6;
    c.gridy = 1;
    panel.add(estimate, c);


    frame.add(panel, GridBagConstraints.CENTER);

    frame.pack();
    frame.setVisible(true);

    linear.setUI(new HintTextFieldUI("Longitud del perímetro", true));
    prep.setUI(new HintTextFieldUI("Minutos de tiempo de preparación", true));
 }

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

}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error “posición ilegal de componente” ocurre usualmente cuando intentas añadir un componente a un contenedor utilizando restricciones inválidas de diseño de GridBag. En este caso, el error es causado porque usaste los mismos valores de gridx y gridy para múltiples componentes.

    Por ejemplo, en tu código, tanto el JTextField linear como el JLabel liLabel tienen los mismos valores de gridx y gridy, lo cual está causando el error:

    liLabel = new JLabel("Basement Perimeter Length");
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridy = 0;
    panel.add(liLabel, c);
    linear = new JTextField(10);
    c.fill = GridBagConstraints.HORIZONTAL;
    c.weightx = 0.5;
    c.gridx = 1;
    c.gridy = 0; // Esto debería ser 1 o 2, no 0
    panel.add(linear, c);
    

    Para arreglar este error, necesitas asegurarte de que cada componente que añadas a tu contenedor tenga un valor único de gridx y gridy. Además, asegúrate de establecer los valores gridwidth y gridheight apropiadamente para cada componente para asegurarte que ocupen el número correcto de celdas de la cuadrícula.

    Además, deberías definir el tamaño de la cuadrícula tú mismo en vez de depender del comportamiento predeterminado. Puedes hacer esto añadiendo el siguiente código al constructor:

    int numRows = 6;
    int numCols = 3;
    for (int row = 0; row < numRows; row++) {
        for (int col = 0; col < numCols; col++) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = col;
            gbc.gridy = row;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            panel.add(new JPanel(), gbc);
        }
    }
    

    Este código creará un panel en blanco para cada celda en la cuadrícula, permitiéndote añadir componentes en las posiciones correctas sin encontrar el error “posición ilegal de componente”.

    En general, es importante leer cuidadosamente la documentación para la clase GridBagLayout y asegurarte de utilizar las restricciones correctas para cada componente. Con algo de prueba y experimentación, deberías poder crear el diseño que deseas.

Comments are closed.