2012-01-08 42 views
7

Tôi có một số JPanel được thêm vào JViewport và bảng điều khiển có một số bảng khác được thêm vào đó. Tôi đang cố gắng triển khai lựa chọn kéo, nơi bạn có thể chọn nhiều hơn một thành phần bằng cách kéo chuột. Vấn đề duy nhất tôi phải đối mặt là hình chữ nhật lựa chọn đang được vẽ phía sau các thành phần được thêm vào chính JPanel. Làm thế nào tôi có thể vẽ trên đầu trang của họ?Tô điểm trên đầu các thành phần trong Swing?

cấu trúc của tôi là như sau:
JFrame ->ContentPane ->JLayeredPane ->JScrollPane ->JPanel ->JPanel [].

dự thảo thiết kế cho nhiệm vụ cao đẳng:
Như bạn thấy, hình chữ nhật là đằng sau những tấm khác.

Design draft for college assignment.

+2

+1: Có vẻ rất đẹp! Hệ điều hành nào đang chạy? Hoặc những gì nhìn và cảm nhận được sử dụng? Phông chữ trông giống như "Ubuntu". –

+0

Hiện tại trên Windows, nhưng khi tôi hoàn thành, nó sẽ giống nhau trên Windows và Mac. Tôi đã tạo ra tất cả các thành phần từ đầu, mà có lẽ là một cách ngây thơ để đi về nó, nhưng tôi thích sự tự do thiết kế nó cho phép. – rtheunissen

+0

Phông chữ là Gotham, nhưng tôi không chắc liệu tôi có giữ nó hay không. : p – rtheunissen

Trả lời

8

Đây là những gì tôi đã làm (về mặt kĩ đơn giản hơn nhiều rõ ràng), và vẽ Swing hình chữ nhật bên dưới các thành phần thêm vào nó.

Đây là trường hợp bạn nên ghi đè lên phương thức paint() của bảng điều khiển chứ không phải phương thức paintComponent(). Sau đó, bức tranh tùy chỉnh sẽ được thực hiện SAU KHI tất cả các thành phần con đã được sơn.

+0

làm cho tôi sence +1 – mKorbel

+0

Tôi thậm chí không nhìn thấy câu trả lời này, tôi sẽ cho nó một đi. Cảm ơn – rtheunissen

+0

Xin lỗi vì đã mất quá nhiều thời gian để báo cáo lại. – rtheunissen

1

Nếu không nhìn thấy mã thực tế của bạn, rất khó để nói những gì bạn đang làm sai. Tuy nhiên, tôi vẫn có thể nói những gì tôi sẽ làm:

Tạo một JPanel đại diện cho toàn bộ khu vực nơi bạn muốn vẽ, trong đó - tất nhiên - chứa mọi thành phần.
Override rằng bảng điều khiển của nó paintComponents(Graphics) như thế này (chỉnh sửa, chú ý đến s tại là ký tự cuối cùng từ tên phương pháp):

@Override 
public void paintComponents(Graphics g) 
{ //     ^
    super.paintComponents(g); 

    // Draw your selection rectangle: 
    g.setColor(Color.RED); 
    g.drawRectangle(selectionRectangle); 
} 
+0

Đây là những gì tôi đã làm (trên một mức độ đơn giản hơn nhiều rõ ràng), và Swing sơn hình chữ nhật bên dưới các thành phần được thêm vào nó. – rtheunissen

+0

Hmm, sau đó thử thay thế paintComponents. –

+0

Nó có hoạt động không, sử dụng paintComponents? –

4

Sử dụng một Layered Pane:

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

này cho phép bạn để tạo các thành phần chồng chéo.

Sử dụng một cửa sổ kính để xử lý các bức tranh kéo, và có thể là các sự kiện cũng như:

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

+0

Được rồi, vì vậy cấu trúc của tôi như sau: JFrame -> ContentPane -> LayeredPane -> JScrollPane -> JPanel -> JPanel []. Tôi đã thêm ảnh chụp màn hình cho câu hỏi. – rtheunissen

+0

Bạn sẽ phải đặt LayeredPane bên trong JScrollPane để có thể cuộn lớp phủ (nếu bạn muốn). –

+0

Tôi nghĩ tôi hiểu ý của bạn là gì. Ví dụ: 'JFrame' ->' ContentPane' -> 'JLayeredPane' ->' JScrollPane' -> ** JLayeredPane ** -> 'JPanel' ->' JPanel [] ' – rtheunissen

1

nóng thực sự chắc chắn những gì bạn thực sự cần thiết và hiệu quả cuối cùng, có lẽ là có hai khác cách vẽ để

1) GlassPane

2) Viewport

bạn ca n đặt cùng nhau, carrefully Insets đến có thể nhìn thấy Rectanle

0

Được rồi, đây là những gì tôi đã quyết định làm cuối cùng:
Tôi không chắc chắn nếu điều này là cách tốt nhất để làm điều đó, nhưng có vẻ như làm việc ổn.
Lưu ý: Sử dụng MigLayout.

Trong hàm tạo của JPanel nằm bên dưới các khối màu.

... 
this.add(new JPanel() { 

    @Override 
    public boolean isOpaque() { 
     return false; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     if (dragShape != null) { 
      g.setColor(Colors.SECONDARY); 
      g.setStroke(new BasicStroke(2)); 
      g.draw(dragShape); 
     } 
    } 
    }, "pos 0 0, width 100%, height 100%", 0); 
    ... 
+0

Xem thêm [opacity] (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props). – trashgod

0

Tùy chỉnh sơn trên đầu trang của các thành phần Swing được tạo điều kiện bởi JLayeredPane. T his article mô tả một lớp cơ sở trừu tượng tạo điều kiện cho việc vượt quá các khu vực cụ thể (như hình chữ nhật lựa chọn hoặc ranh giới thành phần).