簡體   English   中英

在Swing中繪制組件頂部?

[英]Painting over the top of components in Swing?

我有一個JPanel添加到JViewport ,並且面板上添加了幾個其他面板。 我正在嘗試實現拖動選擇,您可以通過拖動鼠標選擇多個組件。 我面臨的唯一問題是選擇矩形被繪制在添加到主JPanel的組件后面。 我怎樣才能在它們上面畫畫?

我的結構如下:
JFrame - > ContentPane - > JLayeredPane - > JScrollPane - > JPanel - > JPanel []

大學任務設計草案:
如您所見,矩形位於其他面板后面。

大學任務設計草案。

這就是我現在正在做的事情(顯然在一個更簡單的層面上),並且Swing在添加到其上的組件下面繪制矩形。

在這種情況下,您應該覆蓋面板的paint()方法而不是paintComponent()方法。 然后自定義繪畫將在所有子組件被繪制后完成。

使用分層窗格:

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

這允許您創建重疊的組件。

使用玻璃窗格來處理拖動繪畫,以及可能的事件:

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

如果沒有看到您的實際代碼,很難說您做錯了什么。 但是,我仍然可以說我會做什么:

創建一個JPanel,代表您要繪制的整個區域,當然 - 包含每個組件。
覆蓋該面板的paintComponents(Graphics)就像這樣(EDITED,注意s現在是方法名稱中的最后一個字符):

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

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

我真的很確定你真正需要什么和最后的效果,也許還有另外兩種繪畫方式

1) GlassPane

2) 視口

你可以把一起,carrefully Insets的可見Rectanle

JLayeredPane為Swing組件上的自定義繪畫提供了便利。 他的文章描述了一個抽象基類,它有助於重繪特定區域(如選擇矩形或組件邊界)。

好的,這是我最終決定做的事情:
我不確定這是否是最好的方法,但似乎工作正常。
注意:使用MigLayout。

JPanel的構造函數中,位於彩色塊下面。

 ...
 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);
  ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM