首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphics2D和JComponent

Graphics2D和JComponent
EN

Stack Overflow用户
提问于 2011-11-29 03:42:55
回答 2查看 6.7K关注 0票数 3

我不经常使用Swing/G2D,所以请耐心等待。我有下面的类,它是我的GUI上的一个组件(意味着是一种可以在上面绘制的画布):

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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。

我一直在寻找答案,我看到的每个例子似乎都是矛盾的。

如果有人尝试过像我这样的人,那么我们将非常感激。另外,如果我采取了完全错误的方法,请一定要说。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-29 04:08:12

JComponent.add方法中,documentation表示:

注意:如果已将组件添加到已显示的容器中,则必须在该容器上调用validate才能显示新组件。如果要添加多个组件,则可以在添加完所有组件后只调用validate一次来提高效率。

在向其中添加元素后,应刷新DrawPanel。当心不要在painComponent方法中这样做,你会陷入无限的递归。

请改为执行以下操作:

代码语言:javascript
复制
DrawPanel drawPanel = new DrawPanel();
drawPanel.add(new BrushStroke());
drawPanel.repaint();

EDIT这里是一个完全可用的解决方案(扩展JPanels而不是JComponent)

代码语言:javascript
复制
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);
    }
}

输出结果如下:

票数 2
EN

Stack Overflow用户

发布于 2011-11-29 06:23:26

  1. 切勿使用任何绘制方法将组件添加到面板中。每当Swing确定需要绘制组件时,都会调用绘制方法。因此,您需要多次将组件添加到面板中。
  2. 当您进行自定义绘制时,您负责重写getPreferredSize()方法以提供组件的大小。这样,布局管理器就可以正确地定位组件。如果不这样做,则首选大小为0,因此没有什么可绘制的。

有关更多信息和示例,请阅读Custom Painting上的Swing教程中的部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8301365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档