在我的應用程序中,我需要繪製像Photoshop一樣的網格線 - 例如,用戶可以在文檔上拖動線條以幫助對齊圖層。現在,問題是我能夠繪製這樣的線條(這只是簡單的使用Line2D的簡單Java2D繪畫),但是我無法將這些線條保留在其他任何東西之上,因爲當子組件繪製自己時,我的網格線被擦除。在所有其他組件上繪製(Swing,Java)
程序結構是這樣的:的JFrame - >的JPanel - > JScrollPane中 - >的JPanel - > [許多其他JPanels,它們是類似的層]
作爲測試,我添加繪製代碼的JFrame,它能正確顯示我的Line2D實例在其他任何位置上。但是,當我在需要該子進行重繪的子組件中執行任何操作時,JFrame中繪製的線將被刪除。
我知道這是預期的擺動行爲 - 也就是說,它只會重繪那些已經改變的區域。但是,我正在尋找一種方法,不斷在其他所有方面上繪製網格線。
我能夠使它工作的唯一方法是使用一個Swing Timer,它每10ms在我的根組件上調用repaint(),但它消耗了大量的CPU。
UPDATE
工作的例子的代碼如下。請注意,在我的真實應用程序中,我有幾十個可能觸發重繪(repaint)的不同組件,它們都沒有引用網格線繪製的組件(當然,我可以將它傳遞給每個人)是最新的選項)
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridTest extends JFrame {
public static void main(String[] args) {
new GridTest().run();
}
private void run() {
setLayout(null);
setPreferredSize(new Dimension(200, 200));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel p = new JPanel();
p.setBounds(20, 20, 100, 100);
p.setBackground(Color.white);
add(p);
JButton b = new JButton("Refresh");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// When I call repaint() here, the paint() method of
// JFrame it's not called, thus resulting in part of the
// red line to be erased/overridden.
// In my real application application, I don't have
// easy access to the component that draws the lines
p.repaint();
}
});
b.setBounds(0, 150, 100, 30);
add(b);
pack();
setVisible(true);
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D gg = (Graphics2D)g.create();
Line2D line = new Line2D.Double(0, 50, getWidth(), 50);
gg.setStroke(new BasicStroke(3));
gg.setColor(Color.red);
gg.draw(line);
gg.dispose();
}
}
爲什麼不能在的paintComponent方法,而不是開始的結束畫網格線?另外,要獲得更具體的幫助,請考慮創建併發布顯示問題的[SSCCE](http://sscce.org)。 –
我這樣做了,但問題是,當一個子組件重新繪製自己時,父組件(位於層次結構中最遠端的組件,如果沒有未知的getParent()調用)不能訪問它。我會嘗試獲得一個工作代碼在這裏展示。 –
@Rafael Steil請參閱我的編輯 – mKorbel