在我的应用程序中,我需要绘制像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