2012-09-26 18 views
5

Hola a todos, tengo un JFrame que tiene tres componentes dentro.Java Swing: ¿Cómo puedo cambiar el tamaño de una fila en un diseño de cuadrícula y permitir que cambie el tamaño dinámicamente solo horizontalmente y no verticalmente?

  1. Un menú
  2. Un panel de pestañas
  3. un panel que tiene algunos botones

Inicialmente mi objetivo era crear un diseño como el siguiente: enter image description here

cuando el usuario cambiaría el tamaño de la aplicación, todo se redimensionaría también. Así que pensé que tal vez si he utilizado un diseño de cuadrícula sencilla mi problema estaría resuelto, por lo que decidí hacer lo siguiente:

  1. El panel de pestañas tendrá algunos paneles interiores y los paneles seguirá el diseño de cuadrícula.

  2. el panel en la parte inferior seguirá el diseño de la cuadrícula.

  3. el JFrame seguirá también el diseño de la cuadrícula.

Resultados:

enter image description here

Como se puede ver que esto no es lo que quería, los botones son demasiado grandes y aunque la aplicación redimensiona muy bien:

enter image description here

Los botones cambian de tamaño también, pero siguen siendo demasiado grandes. Me gustaría poder establecer un tamaño pequeño para los botones (más específicamente el panel en el que están contenidos) y cuando el usuario cambia el tamaño de la aplicación, los botones cambiarían de tamaño solo horizontalmente nunca verticalmente, lo que significa que SOLAMENTE el panel con pestañas se agrandaría verticalmente ¿Se puede lograr esto? Busqué y descubrí sobre gridbaglayout, empecé a jugar un poco, pero no logré nada. Todo lo que pude hacer es la siguiente:

enter image description here

parece buena, pero cuando cambio el tamaño de esto es lo que me sale:

enter image description here

gracias de antemano.

Respuesta

10

Usaría BorderLayout para el panel de contenido. Coloque el panel con pestañas en él usando BorderLayout.CENTER, y el panel de botones en él usando BorderLayout.SOUTH.

+0

+1 creo que esto funcionará también. Luego 'setPreferredSize' para el panel inferior. Eso hará que su altura sea constante. No configure el tamaño para el panel central. De esa forma, todo lo demás mantiene un tamaño, mientras que solo el centro se expande cuando expandes la ventana. Además, el panel inferior debe usar un 'FlowLayout'. – davidXYZ

+1

@davidXYZ No es necesario establecer el tamaño preferido en el panel inferior. ¡configurar el tamaño preferido es la excepción! –

+0

@davidXYZ Le gustaría leer algo sobre [esto] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) antes empiezas a jugar con los tamaños pref/max/min – MadProgrammer

7

el JFrame seguirá también el diseño de la cuadrícula.

Éste es su problema.En su lugar, utilice el valor predeterminado BorderLayout (por lo retire su llamada que establece la disposición del JFrame a un GridLayout) y

  1. Añadir su panel de botones con la restricción BorderLayout.SOUTH
  2. Añadir su panel con separadores sin limitaciones (lo que significa la restricción BorderLayout.CENTER)

Tome un vistazo a la Swing LayoutManager tutorial y, en particular, el ejemplo que se refiere BorderLayout.

pequeño ejemplo:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.SwingUtilities; 

public class TestLayout { 

    protected void initUI() { 
     final JFrame frame = new JFrame(TestLayout.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JMenuBar menuBar = new JMenuBar(); 
     JMenu fileMenu = new JMenu("File"); 
     JMenuItem newItem = new JMenuItem("New..."); 
     JMenuItem open = new JMenuItem("Open..."); 
     fileMenu.add(newItem); 
     fileMenu.add(open); 
     menuBar.add(fileMenu); 
     JTabbedPane tabs = new JTabbedPane(); 
     tabs.addTab("Tab 1", new JPanel()); 
     tabs.addTab("Tab 2", new JPanel()); 
     tabs.addTab("Tab 3", new JPanel()); 
     JPanel buttonPanel = new JPanel(new GridLayout()); 
     buttonPanel.add(new JButton("Button-1")); 
     buttonPanel.add(new JButton("Button-2")); 
     buttonPanel.add(new JButton("Button-3")); 
     frame.add(tabs); 
     frame.add(buttonPanel, BorderLayout.SOUTH); 
     frame.setJMenuBar(menuBar); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestLayout().initUI(); 
      } 
     }); 
    } 
} 
Cuestiones relacionadas