Вопрос по background, java, swing, awt, graphics – Как заставить фоновую работу в кастомном JComponent?

7

В следующем примере у меня есть кастом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

он поддерживает только это свойство backgroun, но на самом деле не рисует его. Pum использует g.fillRect (или fillEllipse, если это эллипс), чтобы создать свой собственный фон.

1

You are never calling Graphics.setColor(), so the color you are painting in is completely unknown. You have declared this component to be opaque, which means that you are promising to paint the background yourself.

Вы хотите что-то еще, как это:

    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(), Эти значения должны быть нулями. Suzan Cioc
12

или использовать JPanel, который рисует фон

+1 Это правильно и кратко, но Сьюзан также забыла установить цвет перед звонкомGraphics2D.draw(), Цвет, таким образом, будет непредсказуемым. И поскольку она объявила JComponent непрозрачным, онаmust нарисуйте фон самостоятельно или продолжите от компонента, как JPanel, который делает это.

Похожие вопросы