有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在自定义JComponent中实现后台工作?

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

共 (3) 个答案

  1. # 1 楼答案

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

  2. # 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);
        }
    
  3. # 3 楼答案

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