Java Swing configuración de JPanel Tamaño

Alguien podría señalar a dónde voy mal con esto de java swing gui código. Estoy tratando de agregar dos botones para un JPanel y, a continuación, añadir en un marco después de ajustar el tamaño, pero parece que no se puede responder a la setSize valores que le pasa

public Test() {
    GridLayout layout = new GridLayout(1, 2);
    //this.setLayout(layout);
    this.setSize(700, 700);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    buttonPanel = new JPanel();
    buttonPanel.setSize(new Dimension(30, 100));

    JButton rectButton = new JButton("Rectangle");
    JButton ovalButton = new JButton("Oval");
    buttonPanel.add(rectButton);
    buttonPanel.add(ovalButton);
    this.add(buttonPanel);
    this.add(new PaintSurface());
    this.setVisible(true);  
}
  • El código no tiene mucho sentido. Usted está utilizando un GridLayout, pero la adición de un PaintSurface a BorderLayout.CENTRO. No debería ser el establecimiento de tamaños. Deje que el diseño de decidir cuál es el tamaño adecuado se basa en los tamaños de los componentes que allí se expone.
  • Que la edición no era bueno.
InformationsquelleAutor cobie | 2012-10-31

3 Kommentare

  1. 6

    Este no puede responder de inmediato a su pregunta…pero…

    GridLayout layout = new GridLayout(1, 2);
    this.setLayout(layout);
    //You're original code...
    //Why are you using `BorderLayout.CENTER` on a `GridLayout`
    this.add(new PaintSurface(), BorderLayout.CENTER);

    Se establece el diseño de un GridLayout, pero se utiliza con BorderLayout limitaciones para aplicar uno de los componentes??

    También, asegúrese de que no hay llamadas a Test#pack en otra parte de su código, ya que este se reemplazan los valores de setSize

    ACTUALIZADO (a partir de cambios a la pregunta)

    Recuerde, el layout manager para JFrame es BorderLayout, así que a pesar de que usted está llamando a buttonPanel.setSize, es probable que empezar reemplazado por el administrador de diseño de todos modos.

    Me gustaría tener una lectura a través de Una Guía Visual para el Diseño de los Gerentes y El Uso De Diseño De Gestores De para encontrar un gestor de diseño que mejor se adapte a sus necesidades.

    Si usted no puede encontrar una sola, considere el uso de compuesto de componentes con diferente diseño de los administradores para llevar el diseño más cerca de lo que usted quiere lograr.

  2. 1

    Ok, voy a darle una solución:

    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Cobie extends JFrame{
        JButton rectButton = new JButton("Rectangle");
        JButton ovalButton = new JButton("Oval");
    
        JPanel buttonPanel = new JPanel();
        JPanel paintSurface = new JPanel();
    
        public Cobie(){
            setLayout(new GridLayout(2,1));
            buttonPanel.setBackground(Color.RED);
            paintSurface.setBackground(Color.BLUE);
            buttonPanel.add(rectButton);
            buttonPanel.add(ovalButton);
            add(buttonPanel);
            add(paintSurface);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable(){
                public void run(){
                    Cobie c = new Cobie();
                    c.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    c.setSize(600,400); //Avoid using this method
                    c.setVisible(true);
                }
            });
    
        }
    }
  3. 1

    De acuerdo a su respuesta actualizada, no se ajuste a su disposición en cualquier cosa.

    De todos modos, si usted utiliza LayoutManager (que debe), no tiene sentido llamar a setSize()/setBounds()/setLocation() ya que va a ser anulada por el LayoutManager (que en realidad es su trabajo).

    Y adivinando que su Test clase extiende JFrame, llamando this.add(buttonPanel); this.add(new PaintSurface()); va a añadir dos componentes con la misma restricción (BorderLayout.CENTER, desde BorderLayout es el valor predeterminado LayoutManager del panel de contenido de la JFrame) para el panel de contenido.

    Considerar la lectura de la LayoutManager tutorial.

    Sólo para información, aunque lejos de ser perfecto, esta muestra algo de «trabajo»:

    import java.awt.Dimension;
    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Test extends JFrame {
        private JPanel buttonPanel;
    
        public class PaintSurface extends JButton {
            public PaintSurface() {
                super("Paint surface dummy");
            }
        }
    
        public Test() {
            GridLayout layout = new GridLayout(1, 2);
            this.setLayout(layout);
            this.setSize(700, 700);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            buttonPanel = new JPanel();
            buttonPanel.setSize(new Dimension(30, 100));
    
            JButton rectButton = new JButton("Rectangle");
            JButton ovalButton = new JButton("Oval");
            buttonPanel.add(rectButton);
            buttonPanel.add(ovalButton);
            this.add(buttonPanel);
            this.add(new PaintSurface());
            this.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Test();
                }
            });
        }
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea