2010-02-22 32 views
20

Trong Swing, cách tốt nhất để làm cho JSplitPane tách hai jpanels với kích thước 50% là bao nhiêu.JSplitPane tách 50% chính xác

Dường như nếu tôi không đặt kích thước ưa thích trên tấm nó luôn luôn làm cho bảng điều khiển đầu tiên gần như vô hình (2%) và thứ hai (98%)

Cảm ơn trước

Trả lời

24

Sử dụng

setResizeWeight(.5d);

[...] giá trị 0, mặc định, chỉ ra đúng/thành phần đáy được tất cả các không gian thêm (bên trái/đầu componen t hoạt động cố định), với giá trị là 1, chỉ định thành phần bên trái/trên sẽ có được tất cả khoảng trống thừa (thành phần bên phải/phía dưới cố định). [...]

+5

setResizeWeight (double) chỉ được sử dụng để "phân phối thêm không gian khi kích thước của những thay đổi split pane". Nó không xác định phân bố không gian ban đầu. – Adamski

27

Bạn nên sử dụng setDividerLocation(double proportionalLocation) để xác định sự phân bố không gian ban đầu của JSplitPane, và sau đó gọi setResizeWeight(double) với cùng một giá trị để đảm bảo rằng các panel này đều được thay đổi kích cỡ tương ứng.

Ngoài ra, lưu ý: Kêu gọi setDividerLocation(double) trước JSplitPane có thể nhìn thấy sẽ không hoạt động chính xác, như việc tính toán không gian dựa trên kích thước hiện hành của Component. Thay vào đó bạn cần phải liên quan đến một hack khó chịu, chẳng hạn như trọng các 's JPanel phương pháp sơn có chứa JSplitPane:

private boolean painted; 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 

    if (!painted) { 
     painted = true; 
     splitPane.setDividerLocation(0.25); 
    } 
} 
+0

+1 Nó hoạt động tuyệt vời! Chỉ có một lưu ý cho người tiếp theo rơi vào trường hợp này: hãy nhận biết thuộc tính "kích thước tối thiểu" của các thành phần. Nếu kích thước tối thiểu lớn hơn không gian có sẵn, thì điểm vẽ đầu tiên của JSplitPane sẽ hoạt động tốt, nhưng nếu bạn thay đổi kích cỡ khung, nó sẽ được tính toán lại. Trong trường hợp đó, một sửa chữa nhanh: 'component.setMinimumSize (new Dimensions (0,0))' –

4

Tôi đã có một vấn đề tương tự và tôi giải quyết nó bằng cách sử dụng một người biết lắng nghe thành phần trong các thùng chứa phụ huynh và thiết lập vị trí chia trên kích thước đầu tiên. Bắt đầu một biến đầu tiênResize thành true và thêm biến này vào hàm tạo thùng chứa gốc:

addComponentListener(new ComponentAdapter(){ 
    @Override 
    public void componentResized(ComponentEvent e) { 
     if(firstResize){ 
      splitPane.setDividerLocation(0.5); 
      firstResize = false; 
     } 
    } 
}); 

Điều này sẽ làm cho dải phân cách được căn giữa khi kích thước vùng chứa gốc được đặt đầu tiên.

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