Вопрос: Как сделать фоновой работу в пользовательском 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);
            }
        });
    }
}

7


источник


Ответы:


JComponent не рисует свой фон. Вы можете либо нарисовать его самостоятельно, либо использовать JPanel, который рисует свой фон


12



Насколько я помню, он поддерживает только это свойство backgroun, но на самом деле не нарисовал его. Для создания собственного фона используйте p. G. FillRect (или fillEllipse, если это эллипс).


1



В вашем методе 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);
    }

1