1

JPanel にペイントのコードがありますが、メソッド paint() の外で色を変更する方法がわかりません

私はコードを与える:

public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.RED);
        for (Shape linea : lineas) { // dibuja todos las elipses
            g2.draw(linea);
        }
    }

そのメソッドを使用して色を変更することしか知りませんg2.setColor(Color.RED); が、MenuItem の actionListener で変更したいと考えています。

4

1 に答える 1

3

クラスに変数を追加し、Colorその変数を使用して の色を設定する だけGraphicsです。また、メソッドを呼び出すpaintComponentよりもオーバーライドする方が適切であり、常に推奨されます。paintsuper

パネルの色をランダムに設定するこの例を参照してください。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestColoredPanel {

    private static class ColoredPanel extends JPanel {

        private Color color = Color.RED;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(getColor());
            g.fillRect(0, 0, getWidth(), getHeight());
        }

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) {
            this.color = color;
            repaint();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }

    }

    protected void initUI() {
        final JFrame frame = new JFrame(TestColoredPanel.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final ColoredPanel panel = new ColoredPanel();
        frame.add(panel);
        JButton button = new JButton("Click me");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Random r = new Random();
                panel.setColor(new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256)));
            }
        });
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestColoredPanel().initUI();
            }
        });
    }
}
于 2013-04-18T14:04:10.423 に答える