2012-09-26 743 views
5

Xin chào mọi người, tôi có một JFrame có ba thành phần bên trong.Java Swing: Làm thế nào tôi có thể thay đổi kích thước của một hàng trong bố cục lưới và cho phép nó thay đổi kích thước động chỉ theo chiều ngang và không theo chiều dọc?

  1. Một menu
  2. Một tab pane
  3. một bảng điều khiển có một số nút

Ban đầu mục tiêu của tôi là tạo ra một thiết kế như sau: enter image description here

khi người dùng sẽ thay đổi kích thước ứng dụng, mọi thứ sẽ được thay đổi kích cỡ. Vì vậy, tôi nghĩ có lẽ nếu tôi sử dụng một cách bố trí lưới đơn giản vấn đề của tôi sẽ được giải quyết, vì vậy tôi đã quyết định làm như sau:

  1. Các cửa sổ tab sẽ có một số tấm bên trong và những tấm pin sẽ làm theo cách bố trí lưới điện.

  2. Bảng điều khiển ở dưới cùng sẽ theo bố cục lưới.

  3. JFrame cũng sẽ theo bố cục lưới.

Kết quả:

enter image description here

Như bạn có thể thấy điều này không phải là những gì tôi muốn, các nút là quá lớn và mặc dù việc áp dụng thay đổi kích thước rất tốt:

enter image description here

Các nút cũng thay đổi kích thước nhưng chúng vẫn quá lớn. Tôi muốn có thể đặt kích thước nhỏ cho các nút (cụ thể hơn là bảng điều khiển được chứa) và khi người dùng thay đổi kích thước ứng dụng, các nút sẽ chỉ thay đổi kích thước theo chiều ngang không bao giờ theo chiều dọc. theo chiều dọc. Điều này có thể đạt được không? Tôi đã tìm kiếm và phát hiện ra về gridbaglayout, tôi bắt đầu chơi một chút, nhưng tôi đã không đạt được bất cứ điều gì. Tất cả tôi cố gắng làm là như sau:

enter image description here

có vẻ tốt, nhưng khi tôi thay đổi kích thước này là những gì tôi nhận được:

enter image description here

cảm ơn trước.

Trả lời

10

Tôi sẽ sử dụng BorderLayout cho ngăn nội dung. Đặt ngăn chứa thẻ trong đó bằng cách sử dụng BorderLayout.CENTER và bảng điều khiển các nút trong đó bằng cách sử dụng BorderLayout.SOUTH.

+0

+1 Tôi nghĩ rằng điều này sẽ làm việc quá. Sau đó, 'setPreferredSize' cho bảng điều khiển thấp hơn. Điều đó sẽ làm cho chiều cao của nó không đổi. Không đặt kích thước cho bảng điều khiển trung tâm. Bằng cách đó mọi thứ khác duy trì kích thước trong khi chỉ có trung tâm mở rộng khi bạn mở rộng cửa sổ. Ngoài ra, bảng điều khiển bên dưới nên sử dụng 'FlowLayout'. – davidXYZ

+1

@davidXYZ Không cần đặt kích thước ưa thích trên bảng điều khiển bên dưới. đặt kích thước ưa thích là ngoại lệ! –

+0

@davidXYZ Bạn có thể muốn đọc [this] (http://stackoverflow.com/questions/7229226/should-i-avoid-the-use-of-setpreferredmaximumminimumsize-methods-in-java-swi) trước bạn bắt đầu rối tung với các kích thước pref/max/min – MadProgrammer

7

JFrame cũng sẽ theo bố cục lưới.

Đây là vấn đề của bạn.Thay vào đó, sử dụng mặc định BorderLayout (để loại bỏ cuộc gọi của bạn chính xác đến cách bố trí của các JFrame để một GridLayout) và

  1. Thêm bảng điều khiển nút bấm của bạn với chế BorderLayout.SOUTH
  2. Thêm cửa sổ theo thẻ của bạn mà không cần bất kỳ khó khăn (có nghĩa là hạn chế BorderLayout.CENTER)

Hãy nhìn vào các Swing LayoutManager tutorial và đặc biệt, ví dụ rằng liên quan đến BorderLayout.

ví dụ nhỏ:

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