2012-09-26 5 views
5

Ciao a tutti, ho un JFrame che contiene tre componenti.Java Swing: come posso modificare le dimensioni di una riga in un layout a griglia e consentirne il ridimensionamento dinamico solo in orizzontale e non in verticale?

  1. Un menu
  2. Un riquadro a schede
  3. un pannello che ha alcuni tasti

Inizialmente il mio obiettivo era quello di creare un design simile al seguente: enter image description here

quando l'utente ridimensionerebbe l'applicazione, anche tutto sarebbe ridimensionato. Così ho pensato che forse se ho usato un semplice layout a griglia il mio problema sarebbe risolto, così ho deciso di fare quanto segue:

  1. Il riquadro a schede avrà alcuni pannelli all'interno e quei pannelli seguirà il layout della griglia.

  2. il pannello in basso seguirà il layout della griglia.

  3. JFrame seguirà anche il layout della griglia.

Risultati:

enter image description here

Come si può vedere non è questo quello che volevo, i pulsanti sono troppo grandi e, anche se l'applicazione ridimensiona molto bene:

enter image description here

Anche i pulsanti vengono ridimensionati, ma rimangono troppo grandi. Mi piacerebbe essere in grado di impostare una piccola dimensione per i pulsanti (più precisamente il pannello in cui sono contenuti) e quando l'utente ridimensiona l'applicazione, i pulsanti si ridimensionano solo in orizzontale mai in verticale, il che significa che SOLO il pannello a schede crescerà più grande verticalmente. È possibile? Ho cercato e scoperto di gridbaglayout, ho iniziato a giocare un po ', ma non ho ottenuto nulla. Tutto quello che sono riuscito a fare è la seguente:

enter image description here

sembra buono, ma quando ho ridimensionare questo è ciò che ottengo:

enter image description here

grazie in anticipo.

risposta

10

Vorrei utilizzare BorderLayout per il riquadro del contenuto. Inserire il pannello a schede in esso utilizzando BorderLayout.CENTER e il pannello di pulsanti in esso utilizzando BorderLayout.SOUTH.

+0

+1 penso che questo funzionerà anche. Quindi 'setPreferredSize' per il pannello inferiore. Ciò renderà la sua altezza costante. Non impostare le dimensioni per il pannello centrale. In questo modo tutto il resto mantiene una dimensione mentre solo il centro si espande quando si espande la finestra. Inoltre, il pannello inferiore dovrebbe usare un 'FlowLayout'. – davidXYZ

+1

@davidXYZ Non è necessario impostare la dimensione preferita sul pannello inferiore. l'impostazione della dimensione preferita è l'eccezione! –

+0

@davidXYZ Potresti avere una lettura di [questo] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) prima inizi a scherzare con le dimensioni pref/max/min – MadProgrammer

7

JFrame seguirà anche il layout della griglia.

Questo è il tuo problema.Al contrario, utilizzare l'impostazione predefinita BorderLayout (in modo da rimuovere la chiamata che ha impostato il layout del JFrame ad un GridLayout) e

  1. Aggiungi la tua pulsantiera con il vincolo BorderLayout.SOUTH
  2. Aggiungi il tuo riquadro tabulare, senza alcun vincolo (che significa il vincolo BorderLayout.CENTER)

Date un'occhiata al Swing LayoutManager tutorial e, in particolare, l'esempio che riguarda BorderLayout.

piccolo esempio:

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(); 
      } 
     }); 
    } 
} 
Problemi correlati