2

我正在尝试在 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);
     }
}
4

2 回答 2

1

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

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

这样您就不必担心使用空布局,并且您可以通过仅使用Graphics(2d)API 来控制显示图标的位置。

于 2012-10-13T12:36:24.787 回答