¿Es posible hacer que los elementos dentro de un JPanel con GridBagLayout comiencen desde la parte superior izquierda?

Tengo un formulario Swing que contiene un JScrollPane (activityScrollPane) para un JPanel(activityPanel). El panel contiene un JTextField y un JButton (que se usa para agregar más campos al Panel). Ahora el problema es que los elementos parten del centro del panel como en la imagen de abajo (con los bordes marcando el activityScrollPane Perímetro)

enter image description here

El siguiente es el código que estoy usando actualmente para hacer el panel de desplazamiento y los componentes asociados.

 //part of the code for creating the ScrollPane

        final JPanel activityPanel = new JPanel(new GridBagLayout());
        gbc.gridx=0;
        gbc.gridy=0;
        JScrollPane activityScrollPane = new JScrollPane(activityPanel); 
        //adding activity fields
        activityFields = new ArrayList<JTextField>();
        fieldIndex = 0;
        activityFields.add(new JTextField(30));

        final GridBagConstraints activityGBC = new GridBagConstraints();
        activityGBC.gridx=0;
        activityGBC.gridy=0;
        activityGBC.anchor = GridBagConstraints.FIRST_LINE_START;
        activityPanel.add(activityFields.get(fieldIndex),activityGBC);

        fieldIndex++;
        JButton btn_more = (new JButton("more"));
        activityGBC.gridx=1;
        activityPanel.add(btn_more,activityGBC);

¿Cómo puedo hacer que JTextField y JButton o cualquier componente aparezca en la esquina superior izquierda de JScrollPane? Ya he probado a usar

activityConstraints.anchor = GridBagConstraints.NORTHWEST;

como se indica en el SO post, pero no parece funcionar en absoluto.

preguntado el 22 de mayo de 12 a las 10:05

5 Respuestas

Simplemente se olvidó de proporcionar cualquier weightx/weighty valores, al menos uno que tenga un valor distinto de cero servirá. echa un vistazo a este ejemplo de código:

import java.awt.*;
import javax.swing.*;
public class GridBagLayoutDemo
{
    private JTextField tfield1;
    private JButton button1;

    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridBagLayout());

        tfield1 = new JTextField(10);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;   
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;  
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;       
        contentPane.add(tfield1, gbc);

        button1 = new JButton("More");
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.NONE;
        contentPane.add(button1, gbc);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new GridBagLayoutDemo().displayGUI();
            }
        });
    }
}

Última EDICIÓN: sin espacio a lo largo del eje Y

import java.awt.*;
import javax.swing.*;
public class GridBagLayoutDemo
{
    private JTextField tfield1;
    private JButton button1;
    private JTextField tfield2;
    private JButton button2;

    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridBagLayout());

        tfield1 = new JTextField(10);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;   
        gbc.weightx = 1.0;
        //gbc.weighty = 0.2;    
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;       
        contentPane.add(tfield1, gbc);

        button1 = new JButton("More");
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.NONE;
        contentPane.add(button1, gbc);

        tfield2 = new JTextField(10);
        gbc.weightx = 1.0;
        gbc.weighty = 0.2;  
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;       
        contentPane.add(tfield2, gbc);

        button2 = new JButton("More");
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.NONE;
        contentPane.add(button2, gbc);

        JScrollPane scroller = new JScrollPane(contentPane);

        frame.add(scroller);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new GridBagLayoutDemo().displayGUI();
            }
        });
    }
}

contestado el 23 de mayo de 12 a las 02:05

funciona para el primer campo. Pero cuando trato de agregar más JTextFields, se distribuyen por igual en toda la altura. ¿Hay alguna manera de prevenir eso también? - Ankit

@Ankit: Demasiado simple, solo comenta esta línea gbc.weighty = 1.0, aunque mantenga el weightx valor como está :-), por favor, vuelva atrás, si quiere algo más, que no pude entender :-) - cOw nIcE

la primera parte de hacer que comience desde arriba está bien. Pero la cosa es que si uso weighty, luego comienza en la parte superior, pero a medida que agrego más campos, no comienzan justo debajo del campo anterior. En cambio, comienza en el centro. Supongo que estoy usando el diseño incorrecto. - Ankit

Sólo tiene que utilizar weightx, no uses weighty, si no quiere espacio a lo largo del eje Y entre los componentes, pruebe esta última edición y vea si esto es lo que quería :-) - cOw nIcE

Lo siento, ya que mi respuesta no está de acuerdo con lo que ha preguntado, pero ¿por qué no usa GroupLayout en lugar de GridBag Layout? Eso es mucho más fácil de manejar.

contestado el 22 de mayo de 12 a las 10:05

Pruébalo con Diseño de borde: controls.setLayout(new BorderLayout()); y luego aplicarlo para su JPanel controls.add(yourPanel, BorderLayout.PAGE_START);

yo tambien tengo problemas con GridBagLayout así que lo resolví con BorderLayout y funciona tan bien.


Así que escribí para tu pequeño ejemplo:

private void initComponents() {

        controls = new Container();
        controls = getContentPane();
        controls.setLayout(new BorderLayout());

        panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        field = new JTextField(20);
        c.gridx = 0;
        c.gridy = 0;
        panel.add(field, c);

        one = new JButton("Go!");
        c.gridx = 1;
        c.gridy = 0;
        panel.add(one, c);

        controls.add(panel, BorderLayout.PAGE_START);

    }  

¡Espero eso ayude!

contestado el 22 de mayo de 12 a las 10:05

Creo que esto podría ser simple y posible, puedes

a este JPanel

  • poner JPanels contiene JComponent de las personas acusadas injustamente llamadas Diseño de cuadrícula (aviso sobre el desplazamiento, debe cambiar el incremento de desplazamiento)

o usar el más complejo JComponents as

  • poner JPanels contiene JComponent como artículo para el Lista J

  • poner JPanels contiene JComponent como fila a la JTable (con una sola Columna, con o sin TableHeader)

contestado el 22 de mayo de 12 a las 10:05

Agregue un panel a la derecha y otro en la parte inferior.

Panel derecho: Kit Peso X a 1.0. Colocar Llene a horizontal.

Panel inferior: Kit Peso Y a 1.0. Colocar Llene a vertical

Puede haber mejores maneras de hacerlo, pero esta funcionó para mí.

respondido 22 mar '17, 07:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.