[英]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);
}
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.