2012-08-13 37 views
5

Code:phương thức setPreferredSize không hoạt động

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 

Vì vậy, tôi thiết lập kích thước ưa thích của JPanel-600 600 và đóng gói các khung hình, nhưng kích thước của khung vẫn 0 là bằng 0.

Tại sao điều này và làm thế nào để sửa chữa nó?

+2

Xem: [? Tại sao nó tán thành sử dụng một cách bố trí null trong Swing] (http://stackoverflow.com/questions/6592468/why-is- it-frowned-upon-to-use-a-null-bố trí-trong-swing) –

Trả lời

8

Như bạn nói, pack() sẽ cố gắng và sắp xếp các cửa sổ để mỗi thành phần được thay đổi kích cỡ để preferredSize của nó.

Vấn đề là có vẻ như người quản lý bố cục là người cố gắng sắp xếp các thành phần và các tùy chọn ưa thích của chúng. Tuy nhiên, khi bạn đặt trình quản lý bố cục là rỗng, không có ai chịu trách nhiệm về điều đó.

Hãy thử nhận xét dòng setLayout(null) và bạn sẽ thấy kết quả. Tất nhiên, đối với một cửa sổ hoàn chỉnh, bạn sẽ phải chọn và thiết lập một ý nghĩa LayoutManager.

này hoạt động tốt với tôi:

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     //setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 
+0

ah, công trình này, cảm ơn :) – Doorknob

2

pack() truy vấn kích thước ưa thích của vùng chứa mẹ qua đó của đứa trẻ, do đó bạn sẽ phải sử dụng:

setPreferredSize(new Dimension(600, 600)); 

lưu ý khác là để gọi

setLocationRelativeTo(null); 

sau pack() đã được kêu gọi để tính toán tọa độ trung tâm :)

OK, chỉ cần phát hiện bố cục rỗng ở đó, tại sao không sử dụng BorderLayout mặc định của JFrame?

+0

okay cảm ơn rằng các công trình, nhưng bây giờ bất cứ điều gì tôi thêm vào JPanel không xuất hiện! – Doorknob

+0

Xem cập nhật của tôi ở trên – Reimeus

+1

+1 để yêu cầu thay đổi trình tự, trong đó thực hiện cuộc gọi. Đầu tiên thêm các thành phần vào 'JFrame', để kích thước của nó có thể được nhận ra, sau đó hướng dẫn vị trí của nó trên màn hình tương ứng với kích thước của nó, và sau đó đặt nó thành hiển thị. cách tiếp cận tốt :-) –

2

Vấn đề của bạn là setLayout(null), becase các tài liệu nói cho pack():

Nguyên nhân Window này để được kích thước để phù hợp với kích thước ưa thích và bố trí các thành phần phụ của nó

do đó không có bố trí nó không thực thi đúng.

Điều này dường như làm việc tốt cho tôi:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame { 

    JPanel panel = new JPanel(); 

    private void createAndShowGUI() { 
     setTitle("FrameDemo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     panel.setPreferredSize(new Dimension(600, 600)); 
     add(panel); 

     //setLayout(null); //wont work with this call as pack() resizes according to layout manager 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Game().createAndShowGUI(); 
      } 
     }); 
    } 
} 
Các vấn đề liên quan