2013-01-14 128 views
5

Đây là Bài đăng đầu tiên của tôi ở đây, vì vậy hãy tha thứ cho tôi nếu tôi làm sai điều gì đó.Các thành phần Java Swing không có Kích thước chính xác khi được thêm vào JPanel

Vấn đề của tôi là:

Tôi cố gắng để thêm các thành phần vào một JPanel với các giá trị được định nghĩa cho Kích thước, vv Nhưng khi tôi thêm chúng vào Panel, họ hoàn toàn không có kích thước và vị trí họ cần phải có . Ví dụ:

public class Console extends JFrame { 
    private JPanel mainPanel = new JPanel(); 
    private JTextArea textField = new JTextArea(); 
    private JTextArea textField2 = new JTextArea(); 

    public Console() { 
     this.setSize(500,300); 

     this.mainPanel.setSize(this.getWidth(),this.getHeight()); 

     this.textField.setEditable(false); 
     this.textField.setSize(this.mainPanel.getWidth(), 100); 
     this.textField.setPreferredSize(new Dimension(this.mainPanel.getWidth(),this.mainPanel.getHeight())); 
     this.textField.setLocation(0, 0); 
     this.textField.setText("some text"); 
     this.textField.setVisible(true); 

     this.textField2.setSize(this.mainPanel.getWidth(),200); 
     this.textField2.setPreferredSize(new Dimension(this.getWidth(),this.getHeight())); 
     this.textField2.setLocation(0,this.mainPanel.getHeight()-this.textField.getHeight()); 
     this.textField2.setText("blabla"); 
     this.textField2.setVisible(true); 

     this.mainPanel.add(textField); 
     this.mainPanel.add(textField2); 
     this.mainPanel.setVisible(true); 

     this.add(this.mainPanel); 
     // I know you should not call setVisible() in the Constructor, just for making Code more simple here. 
     this.setVisible(true); 
    } 
} 

Khi tôi bắt đầu ứng dụng, cả của JTextArea là thực sự nhỏ và đâu đó ở giữa (không như quy định ở trên) trong khi mainPanel được correct.I cố gắng gọi setSize() và phương thức setPreferredSize() ở các Địa điểm khác nhau trong Mã, nhưng nó không hoạt động. Tôi biết nó là tốt hơn để sử dụng một LayoutManager để làm điều này như xa như tôi nghe nhưng phải trung thực, tôi không nhận được làm thế nào để sử dụng nó một cách chính xác. Tôi đã kiểm tra nó trên Oracle Doc nhưng tôi sẽ đánh giá cao nếu ai đó có thể đăng một giải pháp sạch cho điều này, Thanks in Advance.

+0

bạn cần sử dụng đúng 'Bố cục' –

+0

Xin lỗi nếu điều này có vẻ ngu ngốc: Nhưng bạn có nghĩa là setLayout() không? Nếu vậy, tôi nghĩ rằng tôi phải, ví dụ, tạo ra một GridLayout. Nhưng tôi có phải thêm các thành phần để bố trí này hoặc làm thế nào nó hoạt động? –

+0

Xem nguyên tắc của tôi làm câu trả lời. –

Trả lời

6

Bạn cần phải thiết lập một hợp Layout cho Container của bạn. Bạn setLayout cho một Container như JFrame, JPanel và cứ tiếp tục như vậy. Bạn không thêm các thành phần khác vào bố cục, nhưng vào một vùng chứa. Sau đó, nó sẽ bố trí chúng cho phù hợp. Đó là cách nó hoạt động.

Với bố cục phù hợp, bạn sẽ không cần phải gọi setLocation(). Ngoài ra setVisible(true) là quá mức, vì đúng là giá trị mặc định cho các thành phần đó trong mã của bạn.

Tốt hơn là không mở rộng JFrame, hãy mở rộng JPanel và thêm nó vào JFrame.

Vui lòng tìm hiểu về EDT và SwingUtilities.invoketLater() bạn cần sử dụng nó.

Ngoài ra, bạn có thể lưu một số byte, không nhập this. mọi lúc.

+0

Tìm kiếm SwingUtilities.invoketLater() và biết rằng JPanel đang sử dụng FlowLayout theo mặc định :). Cảm ơn bạn –

+0

* "Ngoài ra, bạn có thể lưu một số byte, không phải gõ' this.' mọi lúc. "* Có lẽ là mỉa mai khi sử dụng một IDE tự động hoàn thành, thực hiện như vậy có thể * lưu * tổ hợp phím, trong đó IDE sẽ bật danh sách tên phương thức. ;) 1 cho câu trả lời của bạn, –

+1

@AndrewThompson, vâng, đúng là một chút mỉa mai. Tôi nghĩ rằng trong Eclipse người ta có thể nhấn Ctlr + Space để xem danh sách các phương thức và trường mà không cần gõ 'this.' –

2

đó là tất cả về bố cục Swing layout.

+0

Nhờ bạn và Nikolay, tôi sẽ kiểm tra lại. Đã đọc một nơi nào đó sai trong Oracle Documents và chỉ nhận ra nó ^^. Lấy làm tiếc. –

2

Đối JTextArea vấn đề của bạn, sử dụng:

 JTextArea j=new JTextArea(); 
     j.setColumns(20); 
     j.setRows(5); 

Thay đổi các giá trị của setColumns()setRows() để thay đổi kích cỡ; + đề xuất được cung cấp khoảng Layout Managers.

Hope làm việc này;)

+0

+1 vào thông tin hoặc khởi tạo 'JTextArea' với [hàm dựng] thích hợp (http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html#JTextArea (int, % 20int)). Giao diện không có gì để làm với điều này, vì 'JPanel' có mặc định' FlowLayout', chỉ câu trả lời của bạn là quá đúng liên quan đến vấn đề ở bàn tay. –

+0

@GagandeepBali thankyou rất nhiều gagan :) –

+0

Cảm ơn cả hai :). –

-1

thử sử dụng bố cục tuyệt đối của jpanel.

+0

'Bố cục tuyệt đối' là gì? Chưa bao giờ nghe điều đó. Mặc dù nếu bạn đề cập đến Định vị Tuyệt đối, thì trước tiên, bạn nên cố gắng đọc đoạn đầu tiên [Định vị Tuyệt đối] (http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html), về những gì ** Tài liệu Java ** phải nói về điều này, càng nhiều càng tốt kiềm chế bản thân bạn khỏi việc sử dụng nó. –

+1

-1 Đó là lời khuyên tồi tệ nhất mà người ta có thể đưa ra. Bạn hầu như không bao giờ nên sử dụng bố cục tuyệt đối. –