2009-12-10 21 views
13

Tôi có một JSplitPane mà khi được hiển thị nên chia ngăn khoảng 50%.JSplitPane SetDividerLocation Problem

Bây giờ, khi đưa ra một đối số 0,5 (như gợi ý) cho setDividerLocation, Java có vẻ coi nó như một số bình thường thay vì một tỷ lệ phần trăm. Như trong, chia, thay vì đi đến giữa của cửa sổ, là gần như ở đầu của khung bên trái (ngăn được chia theo chiều dọc). Mọi công việc xung quanh?

Trả lời

13

Phương thức setDividerLocation (double) chỉ hoạt động trên khung "nhận ra", có nghĩa là sau khi bạn đã đóng gói hoặc hiển thị khung hình.

Phương thức setDividerLocation (int) có thể được sử dụng bất kỳ lúc nào.

1

Nếu bạn hài lòng với dải phân cách di chuyển đến giữa mỗi lần bạn đổi kích thước ngăn, bạn có thể thêm một ComponentListener và đặt thành phần gọi phương thức thành phần của nó setDividerLocation (0.5).

+3

Bạn sẽ sử dụng phương pháp setResizeWeight (...) cho việc này. – camickr

3

này sửa chữa nó:

public class JSplitPane3 extends JSplitPane { 
    private boolean hasProportionalLocation = false; 
    private double proportionalLocation = 0.5; 
    private boolean isPainted = false; 

    public void setDividerLocation(double proportionalLocation) { 
     if (!isPainted) { 
      hasProportionalLocation = true; 
      this.proportionalLocation = proportionalLocation; 
     } else { 
      super.setDividerLocation(proportionalLocation); 
     } 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     if (!isPainted) { 
      if (hasProportionalLocation) { 
       super.setDividerLocation(proportionalLocation); 
      } 
      isPainted = true; 
     } 
    } 

} 
+0

Chỉ để làm rõ tôi đã nhận nó để làm việc bằng cách sử dụng chỉ vẽ() và không có lococationLocation nếu tôi chỉ định nó bằng tay trong mã. Ngắn hơn nhiều so với monstrosity – TheLQ

+0

Cảm ơn. Chỉ cần đi qua này và nó đã được bugging chúng tôi cho các lứa tuổi. +1 – Andez

+0

Tôi đã luôn sử dụng phương pháp này. Tuy nhiên, tôi đã nhận thấy rằng bạn sẽ tạm thời nhìn thấy vị trí dải phân cách ở vị trí sai trước khi nó được di chuyển. Để giải quyết điều này, thay vì sau đó ghi đè sơn (Đồ họa) tôi đã thực hiện để ghi đè xác thực() thay thế. – Adamski

0

Có một giải pháp here đó là một chức năng đơn giản mà không đòi hỏi phụ classing hoặc bất kỳ thay đổi khác để splitpane của bạn.

26

Tôi có thiếu gì đó không? Dường như có rất nhiều câu trả lời khá phức tạp cho câu hỏi này ... nhưng tôi nghĩ một setResizeWeight đơn giản (0,5) sẽ giải quyết vấn đề ... được mô tả trong SplitPane Tutorial

+1

+1 - cũng được mô tả (ẩn ?!) như bình luận cho câu trả lời của lins314159 ... –

+0

Oh oops, tôi đã bỏ qua điều đó trong phần bình luận. Cảm ơn. Có vẻ lạ mặc dù câu trả lời phổ biến nhất đã không đề cập đến nó ... trên một câu hỏi đó là 2 tuổi bây giờ. –

+0

+1 Đây phải là câu trả lời được chấp nhận –

1

Điều này phù hợp với tôi, dựa trên Dave Rays link.

/** 
* Set JSplitPane proportional divider location 
* 
* @param jsplitpane JSplitPane to set 
* @param proportionalLocation double <0.0; 1.0> 
*/ 
public static void setJSplitPaneDividerLocation(final JSplitPane jsplitpane, final double proportionalLocation) 
{ 
    if (jsplitpane.isShowing()) 
    { 
     if (jsplitpane.getWidth() > 0 && jsplitpane.getHeight() > 0) 
     { 
      jsplitpane.setDividerLocation(proportionalLocation); 
     } 
     else 
     { 
      jsplitpane.addComponentListener(new ComponentAdapter() 
      { 
       @Override 
       public void componentResized(ComponentEvent ce) 
       { 
        jsplitpane.removeComponentListener(this); 
        setJSplitPaneDividerLocation(jsplitpane, proportionalLocation); 
       } 
      }); 
     } 
    } 
    else 
    { 
     jsplitpane.addHierarchyListener(new HierarchyListener() 
     { 
      @Override 
      public void hierarchyChanged(HierarchyEvent e) 
      { 
       if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && jsplitpane.isShowing()) 
       { 
        jsplitpane.removeHierarchyListener(this); 
        setJSplitPaneDividerLocation(jsplitpane, proportionalLocation); 
       } 
      } 
     }); 
    } 
} 
1

sử dụng setResizeWeight(double);

0

Sau đây trong Component với JSplitPane làm nó quá:

@Override 
public void setVisible(final boolean b) { 
    super.setVisible(b); 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      AppFrame.this.jSplitPane.setDividerLocation(0.9d); 
     } 

    }); 
} 
6

Bạn chỉ có thể thiết lập vị trí chia cửa sổ chia như là một tỷ lệ phần trăm khi tách ngăn có thể nhìn thấy . Bạn có thể nhấn vào các sự kiện của chủ sở hữu cửa sổ chia để xác định thời điểm OK để đặt vị trí của ngăn chia. Ví dụ:

public class MyFrame extends JFrame { 

    public MyFrame() { 

    final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
    // ... set up the split pane, and add to the frame ... 

    // Listen for the frame's "shown" event. 

    addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentShown(ComponentEvent componentEvent) { 

     // Set the divider location to 20%. 
     // This works because we know the pane is visible. 

     splitPane.setDividerLocation(.2); 

     // Stop listening for "shown" events. 

     removeComponentListener(this); 
     } 

    }); 

    pack(); 
    } 
} 
0

tôi tìm thấy sự kết hợp của setResizeWeightsetDividerLocation gọi sau cung cấp các hành vi người ta sẽ mong đợi:

_splitPane.setResizeWeight(0.5); 

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     _splitPane.setDividerLocation(0.5); 
    } 
});