2013-03-15 40 views
5

Trong ứng dụng của tôi, tôi hiển thị hộp thoại bật lên để hiển thị danh sách thẻ lớn. Tôi hiển thị chúng dưới dạng hình ảnh trong nhiều thành phần JLabel trong lớp con JPanel. Sau đó tôi đặt đối tượng đó vào một số JScrollPane để cho phép cuộn ngang qua các thẻ.JScrollPane với nền và nội dung trong suốt

Tôi muốn không gian không sử dụng phải trong suốt với nền tối để cho biết những gì đằng sau nó bị tắt. Tôi đã sử dụng setBackground(new Color(50, 50, 50, 200)) để đạt được giao diện tôi muốn, nhưng nội dung đằng sau nó không vẽ lại, vì vậy tôi nhận được tạo tác.

Đây là những gì nó trông giống như:

Artifacting when scrolling

Làm thế nào tôi sẽ đi về sửa chữa này? Làm thế nào để tôi có được nội dung đằng sau nó để vẽ lại khi tôi cuộn?

Xin cảm ơn trước.

Trả lời

6

Lấy cửa sổ ra khỏi phương trình cho giai đoạn momement.

JScrollPane chứa JViewport sau đó chứa nội dung của bạn. Vì vậy, bạn cần đặt khung nội dung của bạn thành trong suốt, khung nhìn trong suốt và sau đó ngăn cuộn đến trong suốt.

Bạn có thể đạt được điều này bằng cách sử dụng setOpaque(false) trên mỗi vùng chứa này.

Điều này sẽ đảm bảo rằng người quản lý sơn lại sẽ vẽ qua nền.

Vấn đề tiếp theo là, Swing không thực sự hỗ trợ các thành phần "nửa công khai" (có nghĩa là, hoặc là mờ hoặc trong suốt).

Bạn có thể thực hiện điều này bằng cách ghi đè các phương pháp paintComponent của các thành phần chính (phần trên các khung nhìn có lẽ là đủ)

+0

Gọi tốt trên 'JViewport'. Không biết rằng đã tồn tại. Tôi đã sử dụng kết hợp cả hai câu trả lời để sửa nó. – MaxGhost

1

Hãy thử như sau ... có thể cung cấp cho bạn một số cứu trợ trong di chuyển. Bạn cũng có thể gặp sự cố khi khung chính được phóng to hoặc được khôi phục. Bạn sẽ cần một người nghe cho những sự kiện đó và sửa lỗi tương tự .

jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
+0

Cảm ơn. Tôi đã sử dụng kết hợp cả hai câu trả lời để sửa nó. – MaxGhost

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