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);
            }
        });
    }
}
4

3 に答える 3

12

JComponentはその背景をペイントしません。自分でペイントするか、背景をペイントするJPanelを使用することができます

于 2012-06-22T14:05:41.630 に答える
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);
    }

または、JComponentの代わりにJPanelから拡張することもできます。これにより、背景がペイントされ、前景のみが実行されます。

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(getForeground());
        g2.draw(ellipse);
    }
于 2012-06-22T16:56:56.263 に答える
1

私が覚えているように、それはこの背景のプロパティをサポートするだけであり、実際にはそれを描画しません。独自の背景を作成するには、g.fillRect(またはこれが楕円の場合はfillEllipse)を使用します。

于 2012-06-22T14:08:38.113 に答える