在 JPanel 中绘制一个 JComponent



我正在尝试在JPanel中显示JComponent。我使用空布局是因为组件的位置可以在运行时更改,我必须控制它们。

但是下面的代码不起作用。只有当我明确调用"paintComponent"方法时,JComponent 才会在显示中可见,我认为这不是好的做法。

我的JComponent类

public class MyIcon extends JComponent 
{
    private double xPos;
    private double yPos;
    private double radius = 30;
    public MyIcon(double xPos, double yPos)
    {
            this.xPos = xPos;
            this.yPos = yPos;
            this.setBounds((int)xPos, (int)yPos, (int)radius, (int)radius);
            this.setPreferredSize(new Dimension((int)radius, (int)radius ) );
    }
    public Dimension getPreferredSize()
    {
            return ( new Dimension( (int)radius, (int)radius ) );
    }
    public Dimension getMinimumSize() 
    {
            return new Dimension((int)radius, (int)radius);
    }

    public void paintComponent(Graphics g)
    {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.BLACK);
            g2d.drawOval( (int)xPos, (int)yPos, (int)radius, (int)radius);
            g2d.fillOval((int)xPos, (int)yPos, (int)radius, (int)radius);
            System.out.println("Icon.paintComponnet() called");
    }
}

我的面板类

public class MyPanel extends JPanel
{
    private MyIcon myIcon;
    private Graphics2D graphics;
    private int width = 700;
    private int height = 500;
    public MyPanel()
    {
        myIcon = new MyIcon(20,30);
        init();
    }
    private void init()
    {
        setLayout(null);
        setBackground(Color.WHITE);
        setPreferredSize( new Dimension(width, height) );
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        add( myIcon );
        myIcon.repaint();       
    }
    public void paintComponent(Graphics g)
    {
        graphics = (Graphics2D) g;
        super.paintComponent(g);
        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        System.out.println("MyPanel.paintComponnet() called");
        // why my Icon only gets painted if I explicitly call for it ?
        //myIcon.paintComponent(g);
    }
}

我的框架类

public class Editor {
    public static void main(String[] args)
    {
        Editor editor = new Editor();
    }
    private MyPanel myPanel;
    private JFrame frame;
    private JToolBar toolBar;
    public Editor()
    {
        myPanel = new MyPanel();
        init();
    }
    private void init()
    {
        frame = new JFrame("Editor");
        Container content = frame.getContentPane();
        frame.setSize(800, 600);
        frame.setLayout(new BorderLayout(15,15));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        content.add(myPanel,BorderLayout.WEST);
        frame.pack();
        frame.setVisible(true);
     }
}
  • 我会使用 paintIcon() 用于返回图标对象的类

  • public void paintIcon(Component c, Graphics g, int x, int y) {

  • 例如

也许一个好方法是 Icon 类不会扩展JComponent而只是一个简单的对象。

然后,将当前Icon.paintComponent重命名为类似 drawIcon 的名称,并直接从MyPanel.paintComponent调用 drawIcon 方法,并将引用传递给 Graphics 对象。

这样,您就不必考虑使用空布局,并且只需使用 Graphics(2d) API 即可控制显示图标的位置。

相关内容

  • 没有找到相关文章

最新更新