2013-04-30 36 views
2

我正在使用JButton的Action侦听器绘制不同的形状。它工作正常,但如何保持面板上以前绘制的形状?因为当另一个按钮按下以前的形状已经消失。显示JPanel上的所有绘制形状

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包含按下按钮字幕。

+0

基本问题是,在每个绘画循环中,您需要将图形恢复到您需要的状态。也就是说,您将需要重新绘制您之前绘制(并希望保留)的任何东西 – MadProgrammer 2013-04-30 07:38:30

回答

5

这些要么应该做的:

  • 存储所有的绘图操作中的列表和油漆,迭代列表和油漆他们。

  • 将图形绘制到BufferedImage并将图像显示在标签中。例如。可以看出在this answer

+0

您的第一个选择“将所有绘图操作存储在列表和绘画中,迭代列表并将它们全部绘制。”我该怎么做,请解释一下 – iostream007 2013-04-30 08:48:25

+0

试一试,发表一下代码,然后问一个更具体的问题。我不打算向你提供一个例子。 – 2013-04-30 08:50:26

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

     }); 
    } 
}