Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPanel上显示所有绘制的形状_Java_Swing_Awt_Java 2d - Fatal编程技术网

Java 在JPanel上显示所有绘制的形状

Java 在JPanel上显示所有绘制的形状,java,swing,awt,java-2d,Java,Swing,Awt,Java 2d,我正在使用JButton的动作监听器绘制不同的形状。它工作正常,但如何始终保持面板上以前绘制的形状?因为当按下另一个按钮时,以前的形状已经消失 jButton1.setText("Button1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {

我正在使用JButton的动作监听器绘制不同的形状。它工作正常,但如何始终保持面板上以前绘制的形状?因为当按下另一个按钮时,以前的形状已经消失

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();

}
。。。。。。。而组件方法是

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

此处字符串包含按下的按钮标题。

这些按钮中的任何一个都可以:

  • 将所有绘图操作存储在列表中,然后在绘制时,迭代列表并全部绘制

  • 将形状绘制到
    缓冲区图像
    并在标签中显示图像。如:


您可以简单地绘制缓冲图像并显示该图像

演示代码:

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

        });
    }
}
显示了两种常见的方法:

  • 绘制列表中包含的对象
  • 绘制包含所有对象的BuffereImage

  • 基本问题是,在每个绘制周期中,需要将图形恢复到需要的状态。也就是说,您将需要重新绘制之前绘制(并希望保留)的任何内容,您的第一个备选方案是“将所有绘制操作存储在列表中并绘制在绘制上,迭代列表并绘制它们。”我将如何做请解释尝试一下,发布代码,并提出更具体的问题。我不打算给你举个例子。