我不经常使用Swing/G2D,所以请耐心等待。我有下面的类,它是我的GUI上的一个组件(意味着是一种可以在上面绘制的画布):
import javax.swing.*;
import java.awt.*;
public class DrawPanel extends JComponent{
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.black);
g2.fillRect(0, 0, getWidth(), getHeight());
BrushStroke bs = new BrushStroke();
add(bs);
}
}我一直在尝试将以下内容添加到上述JComponent中:
import javax.swing.*;
import java.awt.*;
public class BrushStroke extends JComponent{
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.red);
g2.fillOval(0, 0, 10, 10);
}
}DrawPanel上未显示BrushStroke。
我一直在寻找答案,我看到的每个例子似乎都是矛盾的。
如果有人尝试过像我这样的人,那么我们将非常感激。另外,如果我采取了完全错误的方法,请一定要说。
发布于 2011-11-29 04:08:12
在JComponent.add方法中,documentation表示:
注意:如果已将组件添加到已显示的容器中,则必须在该容器上调用validate才能显示新组件。如果要添加多个组件,则可以在添加完所有组件后只调用validate一次来提高效率。
在向其中添加元素后,应刷新DrawPanel。当心不要在painComponent方法中这样做,你会陷入无限的递归。
请改为执行以下操作:
DrawPanel drawPanel = new DrawPanel();
drawPanel.add(new BrushStroke());
drawPanel.repaint();EDIT这里是一个完全可用的解决方案(扩展JPanels而不是JComponent)
public static void main(String[] args){
JFrame frame = new JFrame();
DrawPanel drawPanel = new DrawPanel();
drawPanel.add(new BrushStroke());
frame.getContentPane().add(drawPanel);
frame.pack();
frame.setVisible(true);
}
class DrawPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setPaint(Color.black);
g2.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize(){
return new Dimension(100, 100);
}
}
class BrushStroke extends JPanel{
public void paintComponent(Graphics g){
this.setOpaque(false);
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.red);
g2.fillOval(0, 0, 10, 10);
}
@Override
public Dimension getPreferredSize(){
return new Dimension(10, 10);
}
}输出结果如下:

发布于 2011-11-29 06:23:26
有关更多信息和示例,请阅读Custom Painting上的Swing教程中的部分。
https://stackoverflow.com/questions/8301365
复制相似问题