如何让自定义JComponent的后台工作?(How to make background work

2019-06-25 16:52发布

在下面的例子,我有一个自定义JComponent被画在绿色的背景,但它不会出现。 为什么会出现这种情况?

public class Test_Background {

    public static class JEllipse extends JComponent {

        private final Ellipse2D ellipse;

        public JEllipse(int width, int height) {
            ellipse = new Ellipse2D.Double(0, 0, width, height);

            setOpaque(true);
            setBackground(Color.GREEN);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension((int) ellipse.getBounds().getMaxX(),
                                 (int) ellipse.getBounds().getMaxY());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            ((Graphics2D) g).draw(ellipse);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JEllipse e = new JEllipse(400, 300);

                JFrame f = new JFrame("Background Test");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(e);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}

Answer 1:

JComponent的不画其背景。 您可以自己或者画它,或者使用的JPanel这不绘制其背景



Answer 2:

我记得它仅支持此背景和属性,但实际上并没有画出来。 PUM使用g.fillRect(或FillEllipse函数,如果这是椭圆)来创建自己的背景。



Answer 3:

有你的paint()方法的若干问题。

  • 你永远不会调用Graphics.setColor()所以你画的颜色是完全陌生的。
  • 您已经声明此组件是不透明的,这意味着你要看好自己绘制背景。

你想要更多的东西是这样的:

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(getBackground());
        g2.fillRect(0, 0, getWidth(), getHeight());
        g2.setColor(getForeground());
        g2.draw(ellipse);
    }

或者,你可以从JPanel的,而不是JComponent的延伸,它将绘制背景的你,让你只做前台:

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(getForeground());
        g2.draw(ellipse);
    }


文章来源: How to make background work in custom JComponent?