2013-04-30 4 views
2

Я использую прослушиватель JButton для рисования разных фигур. Он отлично работает, но как сохранить ранее нарисованные фигуры на панели все время? Потому что, когда другая кнопка нажала предыдущие формы, ушла.Показать все нарисованные фигуры на 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); 

Здесь Строка s содержит нажатия кнопки заголовка.

+0

Основная проблема заключается в том, что для каждого цикла красок вам нужно будет восстановить графику до того, что вам нужно. То есть вам нужно будет перекрасить все, что вы ранее нарисовали (и хотите сохранить) – MadProgrammer

ответ

5

Любой из них должен сделать:

  • магазин все операции рисования в списке и на краске, просматривать список и рисовать их всех.

  • Нарисуйте фигуры на BufferedImage и покажите изображение на этикетке. НАПРИМЕР. Как видно из this answer:

+0

ваш первый вариант: «Храните все операции рисования в списке и на краске, перебирайте список и нарисуйте их все». Как я это сделаю, пожалуйста, объясните – iostream007

+0

Попробуйте, отправьте код и задайте более конкретный вопрос. Я не собираюсь подавать вам пример. –

6

Вы могли бы просто привлечь к буферном изображения и отображения этого изображения.

код Demo:

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

     }); 
    } 
} 
3

Custom Painting Approaches показаны два общих подхода:

  1. окрашивать объекты, содержащиеся в списке
  2. краска BufferedImage, содержащий все объекты.
Смежные вопросы