Java 在JPanel上显示所有绘制的形状
我正在使用JButton的动作监听器绘制不同的形状。它工作正常,但如何始终保持面板上以前绘制的形状?因为当按下另一个按钮时,以前的形状已经消失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) {
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();
}
});
}
}
显示了两种常见的方法:
基本问题是,在每个绘制周期中,需要将图形恢复到需要的状态。也就是说,您将需要重新绘制之前绘制(并希望保留)的任何内容,您的第一个备选方案是“将所有绘制操作存储在列表中并绘制在绘制上,迭代列表并绘制它们。”我将如何做请解释尝试一下,发布代码,并提出更具体的问题。我不打算给你举个例子。