0

JButton の Action リスナーを使用してさまざまな形状を描画しています。正常に動作していますが、以前に描画された形状を常にパネルに保持するにはどうすればよいですか? 別のボタンを押すと、以前の形状が消えてしまうためです。

jButton1.setText("Button1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

jButton2.setText("Button2");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    s = evt.getActionCommand();
    repaint();

}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    s = evt.getActionCommand();
    repaint();

}

.......そしてpaintComponentメソッドは

 protected void paintComponent(Graphics g) {
        super.paintComponent(g);


        System.out.println("====>>> " + s);
        switch (s) {

            case "Button1":
                g.drawRoundRect(20,20,40,40,100,200);
                break;

            case "Button2":
                g.drawRect(0, 0, 200, 200);
                break;

            default:
                g.drawOval(40, 40, 100, 100);

ここで String s には、押されたボタンのキャプションが含まれています。

4

3 に答える 3

6

バッファリングされた画像に描画して、その画像を表示するだけです。

デモコード:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;

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

class TestPaint {

    private BufferedImage image;
    private JLabel drawing;

    private int x = 0;
    private int y = 0;

    protected void initUI() {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton jButton1 = new JButton();
        JButton jButton2 = new JButton();
        jButton1.setText("Button1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Button2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        image = new BufferedImage(500, 300, BufferedImage.TYPE_INT_RGB);
        image.getGraphics().setColor(Color.WHITE);
        image.getGraphics().fillRect(0, 0, image.getWidth(), image.getHeight());
        drawing = new JLabel(new ImageIcon(image));
        JPanel bottomPanel = new JPanel(new FlowLayout());
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0));
        buttonPanel.add(jButton1);
        buttonPanel.add(jButton2);
        bottomPanel.add(buttonPanel);
        jFrame.add(drawing);
        jFrame.add(bottomPanel, BorderLayout.SOUTH);
        jFrame.pack();
        jFrame.setVisible(true);
    }

    private Graphics getImageGraphics() {
        return image.getGraphics();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Graphics g = getImageGraphics();
        g.setColor(Color.GREEN);
        g.drawRoundRect(x, y, 40, 40, 100, 200);
        drawing.repaint();
        x += 5;
        y += 5;
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        Graphics g = getImageGraphics();
        g.setColor(Color.BLUE);
        g.drawRect(x, y, 200, 200);
        drawing.repaint();
        x += 5;
        y += 5;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestPaint().initUI();
            }

        });
    }
}
于 2013-04-30T07:46:06.290 に答える
5

これらのいずれかを行う必要があります。

  • すべての描画操作をリストとペイントに保存し、リストを繰り返してすべてペイントします。

  • 形状を に描画しBufferedImage、画像をラベルに表示します。EGこの回答に見られるように:

于 2013-04-30T07:36:46.317 に答える
3

カスタム ペインティング アプローチでは、次の 2 つの一般的なアプローチを示します。

  1. リストに含まれるオブジェクトをペイントする
  2. すべてのオブジェクトを含む BufferedImage を描画します。
于 2013-04-30T16:02:01.893 に答える