【问题标题】:How to make background work in custom JComponent?如何在自定义 JComponent 中使后台工作?
【发布时间】:2012-06-24 20:08:14
【问题描述】:

在以下示例中,我在绿色背景上绘制了一个自定义 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);
            }
        });
    }
}

【问题讨论】:

    标签: java swing graphics background awt


    【解决方案1】:

    JComponent 不绘制其背景。您可以自己绘制,也可以使用 JPanel 绘制背景

    【讨论】:

    • +1 这个是正确简洁的,但是调用Graphics2D.draw()之前Suzan也忘记设置颜色了。因此颜色将是不可预测的。而且因为她已将 JComponent 声明为不透明的,所以她必须自己绘制背景或从组件(如 JPanel)扩展。
    【解决方案2】:

    您的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);
        }
    

    【讨论】:

    • 我认为你也有一个错误:如果从getX()getY() 开始填充不正确。这些值应该为零。
    【解决方案3】:

    我记得它只支持这个背景属性,但实际上并没有绘制它。 Pum 使用 g.fillRect(如果是椭圆,则使用 fillEllipse)来创建自己的背景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2012-07-02
      • 2018-06-02
      • 1970-01-01
      • 2019-04-09
      相关资源
      最近更新 更多