2008-10-17 20 views
7

Vì Canvas3D không có khả năng thay đổi kích thước động với khung chính, tôi muốn có thể theo dõi thời điểm người dùng đổi kích thước cửa sổ và sau đó thay đổi kích thước theo cách thủ công riêng tôi. (Nếu điều này kết thúc lên Canvas3D, như một số tài liệu gợi ý, tôi sẽ chỉ đơn giản là tiêu diệt và tạo lại nó khi người dùng thay đổi kích thước cửa sổ của họ). Một phần của quy trình này liên quan đến việc có thể cho biết chính xác tầm quan trọng của bảng điều khiển container.Tìm chiều cao/chiều rộng "thực" của đối tượng Swing/AWT

Hai phương pháp tôi đã cố gắng:

panel.getHeight(); 
panel.getPreferredSize().height;

Đừng dường như không báo cáo chính xác điều: getHeight() là luôn bằng không, và getPreferredSize() số lợi nhuận mà không thực sự có bất cứ điều gì để làm với kích thước thực tế của bảng điều khiển.

Bất kỳ ý tưởng nào?

Chỉnh sửa: Vì vậy, tôi đã gỡ lỗi cho đối tượng bảng điều khiển và kiểm tra thủ công các thuộc tính không đối tượng và tôi không thấy bất kỳ điều gì giống với chiều rộng/chiều cao. Cấp, có những đối tượng phụ mà tôi không nhìn vào. Ngoài ra, có lẽ cửa sổ phải được nhìn thấy (nó không phải là, tại thời điểm tôi đang interfacing đối tượng) khi tôi truy vấn chiều cao/đối tượng?

Chỉnh sửa 2: Vì vậy, các lớp Swing là lớp con của các lớp AWT, vì vậy tôi tưởng tượng nếu bạn có thể tìm chiều cao/chiều rộng của chúng, cách tiếp cận sẽ tổng quát. Tôi đã sửa đổi tiêu đề cho phù hợp.

Trả lời

19

Để xác định kích thước của một thành phần bạn phải hoặc là:

  • đã đặt nó bằng tay tại một số điểm
  • chạy quản lý bố trí chịu trách nhiệm về layouting thành phần

Nói chung, bạn có được kích thước chính xác của một thành phần thông qua phương thức getSize(), trả về một đối tượng Dimension có chiều rộng và chiều cao, nhưng getWidth/Height() cũng nên hoạt động. Nhưng điều này chỉ có thể hoạt động, nếu một trong hai điều kiện tiên quyết được đáp ứng. Nếu cửa sổ chưa bao giờ được hiển thị, không có trình quản lý bố cục hoặc thành phần (bạn muốn biết kích thước của) đã được thêm sau khi cửa sổ/vùng chứa đã được hiển thị, kích thước thường bằng 0. Vì vậy, để có được kích thước chính xác, bạn phải làm cho container/khung hiển thị (sau khi bạn đã thêm thành phần) hoặc gọi validate() hoặc doLayout() trên vùng chứa để tính toán lại bố cục, nếu bạn thêm thành phần sau khi bố cục cuối cùng được thực hiện. Một điều cần lưu ý là thiết lập và có thể cấu hình trình quản lý bố trí trên vùng chứa. Nếu không có bộ quản lý bố cục nào được đặt (null), thậm chí việc tạo một vùng chứa có thể nhìn thấy được gọi là validate() không đặt kích thước trên các con của nó.

Thuộc tính tối thiểu Kích thước/ưa thíchSize/maximumSize là gợi ý cho trình quản lý bố cục, cách kích thước thành phần, nhưng không cần phải tuân thủ (hầu hết người quản lý bố cục không).

Chỉnh sửa 2: Sau khi tôi đọc your other question về cùng một chủ đề, tôi nghĩ bạn nên đọc Using Layout Managers từ Java Tutorials

Edit: Tôi không biết nếu bạn đã đoán ra, nhưng để phản ứng với các thay đổi kích thước của cửa sổ, bạn có thể làm một cái gì đó như thế này:

public class WindowResizeTest extends JFrame { 

    public static void main(String[] args) { 
     new WindowResizeTest(); 
    } 

    public WindowResizeTest() { 
     this.setSize(640, 480); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.RED); 
     this.add(panel); 

     this.addComponentListener(new ComponentListener() { 

      public void componentResized(ComponentEvent e) { 
       System.out.println(e.getComponent().getSize()); 
      } 

      public void componentHidden(ComponentEvent e) {} 

      public void componentMoved(ComponentEvent e) {} 

      public void componentShown(ComponentEvent e) {} 
     }); 

     this.setVisible(true); 
    } 

} 
1

tôi phát hiện ra rằng nếu bạn mở rộng bởi JFrame, mã này có thể được sử dụng cũng để tiết kiệm thời gian, công sức và thời gian.

int windowWidth = getWidth(); 
int windowHeight = getHeight(); 

Tôi biết bạn đã có câu trả lời nhưng nếu bạn cần thay thế, tại đây.

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