2012-09-26 6 views
5

Witam wszystkich Mam ramkę JFrame, która zawiera trzy komponenty.Java Swing: Jak zmienić rozmiar jednego wiersza w układzie Grid i umożliwić dynamiczną zmianę rozmiaru tylko w poziomie, a nie w pionie?

  1. menu
  2. zakładkami okienko
  3. panelu, który ma kilka przycisków

Początkowo moim celem było stworzenie konstrukcji jak następuje: enter image description here

gdy użytkownik zmieni rozmiar wniosku, wszystko również zostanie zmienione. Więc pomyślałem, że może jeśli kiedyś prosty układ siatki mój problem zostanie rozwiązany, więc postanowiłem wykonać następujące czynności:

  1. zakładkami okienko będzie miał jakieś panele wewnątrz i te panele pójdą układ siatki.

  2. Panel u dołu będzie podążał za układem siatki.

  3. JFrame będzie również podążał za układem siatki.

Wyniki:

enter image description here

Jak widać nie jest to, co chciałem, przyciski są zbyt duże i choć aplikacja zmienia rozmiar bardzo dobrze:

enter image description here

Przyciski zmieniają rozmiar również, ale pozostają zbyt duże. Chciałbym móc ustawić mały rozmiar dla przycisków (dokładniej dla panelu, w którym się znajdują) i kiedy użytkownik zmieni rozmiar aplikacji, przyciski zmieniają rozmiar tylko poziomo nigdy pionowo, co oznacza, że ​​TYLKO okienko z zakładkami będzie się powiększać pionowo. Czy jest to możliwe? Szukałem i dowiedziałem się o gridbaglayout, zacząłem grać trochę, ale nic nie osiągnąłem. Wszystko udało mi się zrobić to:

enter image description here

wydaje się dobre, ale gdy rozmiar jest to, co mam:

enter image description here

z góry dzięki.

Odpowiedz

10

Chciałbym użyć BorderLayout dla panelu zawartości. Umieść w nim okienko z zakładkami, używając BorderLayout.CENTER, a panel przycisków w nim używając BorderLayout.SOUTH.

+0

+1 Myślę, że to będzie działać zbyt. Następnie "setPreferredSize" dla dolnego panelu. To spowoduje, że jego wysokość będzie stała. Nie ustawiaj rozmiaru środkowego panelu. W ten sposób wszystko inne zachowuje rozmiar, a tylko centrum rozszerza się po rozwinięciu okna. Ponadto dolny panel powinien używać 'FlowLayout'. – davidXYZ

+1

@davidXYZ Nie ma potrzeby ustawiania preferowanego rozmiaru na dolnym panelu. ustawienie preferowanego rozmiaru jest wyjątkiem! –

+0

@davidXYZ Być może chciałbyś przeczytać [to] (http://stackoverflow.com/questions/7229226/może-i-pozyska-u -zapewnićmaksymalnąminimalnąsize-metody-w-java-swi) przed zaczynasz mieszać z rozmiarami pref/max/min – MadProgrammer

7

JFrame będzie również podążał za układem siatki.

To jest twój problem.Zamiast używać domyślnego BorderLayout (tak usunąć połączenia, które wyróżniają układ JFrame do GridLayout) i

  1. Dodaj panel przycisk z przymusu BorderLayout.SOUTH
  2. Dodaj panel kartami bez żadnych ograniczeń (co oznacza ograniczenie BorderLayout.CENTER)

Spójrz na Swing LayoutManager tutorial aw szczególności przykład, że dotyczy BorderLayout.

Mały przykład:

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(); 
      } 
     }); 
    } 
} 
Powiązane problemy