2010-06-19 30 views
5

của tôi có một mã mẫu:setSize không ảnh hưởng đến kích thước nút

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(600, 450)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBackground(Color.green.darker()); 

     Button btn_1 = new Button("Button 1"); 
     btn_1.setBackground(Color.green.darker()); 
     btn_1.setSize(40, 100); 
     Button btn_2 = new Button("Button 2"); 
     btn_2.setBackground(Color.green.darker()); 
     btn_2.setSize(40, 100); 
     Button btn_3 = new Button("Button 3"); 
     btn_3.setBackground(Color.green.darker()); 
     btn_3.setSize(40, 100); 

     JPanel players = new JPanel(new GridLayout(1, 3)); 
     players.add(btn_1); 
     players.add(btn_2); 
     players.add(btn_3); 
     players.setBackground(Color.green.darker()); 
     players.setPreferredSize(new Dimension(450, 80)); 

     JPanel game = new JPanel(); 
     game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
     game.setBackground(Color.green); 
     game.setPreferredSize(new Dimension(600, 370)); 

     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 
     frame.setContentPane(content); 
     content.add(players, BorderLayout.NORTH); 
     content.add(game, BorderLayout.SOUTH); 
     frame.pack(); 
frame.setVisible(true); 
    } 
} 

này kết quả là mang lại cho tôi một cửa sổ như:

alt text http://img710.imageshack.us/img710/1573/21672037.gif

, trong khi nó nên kết quả trong một cái gì đó giống như này:

alt text http://img686.imageshack.us/img686/8948/44650673.gif

Tại sao nó không được hiển thị theo cách này?

Trả lời

6

GridLayout bỏ qua kích thước ưa thích của nút. Thay

JPanel players = new JPanel(new GridLayout(1, 3)); 

với

JPanel players = new JPanel(); // default FlowLayout 

Phụ Lục: Dưới đây là một ví dụ liên quan để cho bố trí và kích thước mặc định ưu tiên làm việc. Bằng cách chỉ định một vài ràng buộc nhất có thể, giao diện sẽ điều chỉnh theo giao diện của mỗi nền tảng & cảm thấy khi pack() được gọi.

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel players = new JPanel(); 
     players.add(new GameButton("Button 1")); 
     players.add(new GameButton("Button 2")); 
     players.add(new GameButton("Button 3")); 
     players.setBackground(GameButton.color); 

     JPanel game = new JPanel(); 
     game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
     game.setBackground(Color.green); 
     game.setPreferredSize(new Dimension(600, 450)); 

     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 
     frame.setContentPane(content); 
     content.add(players, BorderLayout.NORTH); 
     content.add(game, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static class GameButton extends JButton { 

     private static final Color color = Color.green.darker(); 
     private static final Font font = new Font("SanSerif", Font.BOLD, 20); 
     private String name; 

     public GameButton(String name) { 
      super(name); 
      this.setBackground(color); 
      this.setFont(font); 
     } 
    } 
} 
+0

đây là một giải pháp tốt cũng cho bố trí. mặc dù setPreferredSize thực hiện một phần kích thước của phép thuật. –

+0

@BalintPato: Điểm tốt; thêm [ở đây] (http://stackoverflow.com/q/7229226/230513). – trashgod

2
  1. GridLayout trải dài ra compoments thêm trực tiếp với họ. Tôi muốn sử dụng một bố trí khác, hoặc nếu bạn thực sự muốn GridLayout kiểm tra mã dưới đây.

  2. Bạn cũng phải sử dụng setPreferredSize trên các nút! (Xem dưới đây)

import java.awt.*; 

import javax.swing.*; 
import javax.swing.border.BevelBorder; 

public class AWT extends JFrame { 

public static void main(String[] args) { 
final JFrame frame = new JFrame(); 
frame.setPreferredSize(new Dimension(600, 450)); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setBackground(Color.green.darker()); 

Button btn_1 = new Button("Button 1"); 
btn_1.setBackground(Color.green.darker()); 
btn_1.setPreferredSize(new Dimension(40, 100)); 

Button btn_2 = new Button("Button 2"); 
btn_2.setBackground(Color.green.darker()); 
btn_2.setPreferredSize(new Dimension(40, 100)); 

Button btn_3 = new Button("Button 3"); 
btn_3.setBackground(Color.green.darker()); 
btn_3.setPreferredSize(new Dimension(40, 100));  

GridLayout layout = new GridLayout(1, 3); 
JPanel players = new JPanel(layout); 
JPanel cell1 = new JPanel(); 
cell1.add(btn_1); 
cell1.setBackground(Color.green.darker()); 
players.add(cell1); 
JPanel cell2 = new JPanel(); 
cell2.add(btn_2); 
cell2.setBackground(Color.green.darker()); 
players.add(cell2); 
JPanel cell3 = new JPanel(); 
cell3.add(btn_3); 
cell3.setBackground(Color.green.darker()); 
players.add(cell3); 
players.setBackground(Color.green.darker()); 
players.setPreferredSize(new Dimension(450, 80)); 

JPanel game = new JPanel(); 
game.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); 
game.setBackground(Color.green); 
game.setPreferredSize(new Dimension(600, 370)); 

JPanel content = new JPanel(); 
content.setLayout(new BorderLayout()); 
frame.setContentPane(content); 
content.add(players, BorderLayout.NORTH); 
content.add(game, BorderLayout.SOUTH); 
frame.pack(); 
frame.setVisible(true); 
} 
} 
+1

Điều này rất hữu ích, nhưng tôi thường cố gắng tránh quá "nặng" một tay với các thuộc tính thành phần. Trên một số nền tảng, ví dụ: Mac OS X, 'setBackground()' trên một 'JButton' không có hiệu ứng rõ ràng; và 'setPreferredSize()' không thể tính đến các chỉ số phông chữ cụ thể cho nền tảng. – trashgod

+0

đó là tất cả sự thật! –

Các vấn đề liên quan