2010-04-26 36 views
9

Tôi có một JScrollpaneJPanel ở bên trong (và bảng điều khiển chứa một số JLabel s).JScrollpane cần thu nhỏ chiều rộng

Tôi muốn thay đổi kích cỡ ngăn cuộn để thực sự thay đổi kích thước của nó (có thể thấp hơn kích thước ưa thích của các thành phần bên trong), không chỉ kích thước của khung nhìn.

Mục tiêu là để bảng điều khiển bên trong biến mất một cách duyên dáng (sử dụng các ưu tiên thu nhỏ cụ thể và các mức tương tự trong phần di chuyển của tôi) khi người dùng thu nhỏ thanh cuộn quá nhỏ.

+0

Câu hỏi đặt ra là khá rõ ràng đối với tôi, nhưng bạn có lẽ có thể theo dõi những thay đổi kích thước của JScrollPane và phản ứng khi nó trở nên thấp hơn so với một số ràng buộc (giấu nó trơn tru). –

+0

Dường như làm một số công cụ chuyển tiếp ngớ ngẩn khi kích thước của các thay đổi 'JViewport' là về cách duy nhất để làm điều đó. (Để làm rõ, về cơ bản tôi có một bảng bên trong khung nhìn của scrollpane. Tôi muốn scrollpane xác định những hàng nào của bảng được hiển thị, nhưng tôi không muốn nó ảnh hưởng đến những cột nào được hiển thị. là chỉ định mức độ ưu tiên thu nhỏ cho các cột khác nhau sao cho thu hẹp kích thước ngang của hộp văn bản sẽ bắt đầu cắt bớt các cột cụ thể.) – Mike

Trả lời

14

Có lẽ phương pháp tốt nhất là có thành phần chứa luôn luôn có cùng chiều rộng với chế độ xem. Để làm điều này thành phần chứa đầu tiên (một là đứa trẻ để JViewPort, được chuyển vào hàm tạo JScrollPane hoặc được đặt làm viewportView) cần triển khai javax.swing.Scrollable. Phương thức chính là getScrollableTracksViewportWidth, phải trả lại true.

Dưới đây là một JPanel cuộn nhanh chóng và dơ bẩn:

public class ScrollablePanel extends JPanel implements Scrollable { 
    public Dimension getPreferredScrollableViewportSize() { 
     return getPreferredSize(); 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return ((orientation == SwingConstants.VERTICAL) ? visibleRect.height : visibleRect.width) - 10; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return true; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 
} 
+0

Tuyệt vời, cảm ơn! Tôi không biết giao diện Scrollable. – Mike

+0

Một điều nữa. Tôi chỉ có giải pháp này làm việc với 'BorderLayout'. Mặc định 'FlowLayout' không hoạt động chính xác cho chế độ xem rất rộng. –

+0

Không sử dụng bố cục luồng. Nó chỉ thích hợp cho các bản demo và thanh nút. Hiện tại có cách để theo dõi chiều rộng của bố cục luồng. – shemnon

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