2013-04-04 70 views
0

我正在一个非常简单的程序上工作。我想要做的是在按下firstButton时添加一个新的圆圈(在确保我的事件正常工作之后,程序当前就是这样)。事件发生时绘制新的图形组件(即圆圈)

我知道我需要一个paintComponent方法的地方,可能需要使用repaint但不能确定如何把这些在

帮助,将不胜感激,谢谢。

public class aGameForBella extends JPanel { 

    private int count1 = 0, count2 = 0, count3 = 0; 
    JButton firstButton, secondButton, thirdButton; 
    JLabel firstLabel, secondLabel, thirdLabel; 
    JPanel optionPanel; 

    //constructor method 
    public aGameForBella() { 
     //create components 
     optionPanel = new JPanel(); 
     firstButton = new JButton("Button option number one"); 
     firstLabel = new JLabel("You pushed the first button: " + count1 
       + " times"); 
     secondButton = new JButton("Button option number two"); 
     secondLabel = new JLabel("You pushed the second button: " + count2 
       + " times"); 
     thirdButton = new JButton("Button option number three"); 
     thirdLabel = new JLabel("You pushed the third button: " + count3 
       + " times"); 
     //add listeners 
     firstButton.addActionListener(new ButtonListener()); 
     secondButton.addActionListener(new ButtonListener()); 
     thirdButton.addActionListener(new ButtonListener()); 

     //add panels 
     add(optionPanel); 

     //add components to panels 
     optionPanel.add(firstButton); 
     optionPanel.add(firstLabel); 
     optionPanel.add(secondButton); 
     optionPanel.add(secondLabel); 
     optionPanel.add(thirdButton); 
     optionPanel.add(thirdLabel); 

     //set size of things 
     optionPanel.setPreferredSize(new Dimension(200, 200)); 
     setPreferredSize(new Dimension(250, 500)); 
     setBackground(Color.cyan); 

    } 

    //inner class 
    private class ButtonListener implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      if (event.getSource() == firstButton) { 
       count1++; 
       firstLabel.setText("You pushed the first button: " + count1 
         + " times"); 
      } else if (event.getSource() == secondButton) { 
       count2++; 
       secondLabel.setText("And you pushed the second button: " 
         + count2 + " times"); 
      } else if (event.getSource() == thirdButton) { 
       count3++; 
       thirdLabel.setText("And the last button: " + count3 + " times"); 

      } 

     } 
    } 
} 
+2

如果你正在寻找好的学习材料,我建议斯坦福讲座(youtube上的视频)。这位教授非常擅长解释Java,并且有很大一部分专门用于图形学。 – didierc 2013-04-04 08:40:01

回答

2

根据您的需求将取决于你的整体做法。

例如,如果要维护正在绘制的内容,需要生成一个包含所需的所有值的列表,以便在组件重新绘制时重现输出。

以下示例基本上包含基于Shape的对象列表,并在每次绘制组件时重新绘制它们。

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawCircles { 

    public static void main(String[] args) { 
     new DrawCircles(); 
    } 

    public DrawCircles() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       final CirclePane circlePane = new CirclePane(); 
       JButton btn = new JButton("Click"); 
       btn.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         circlePane.addCircle(); 
        } 

       }); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(circlePane); 
       frame.add(btn, BorderLayout.SOUTH); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class CirclePane extends JPanel { 

     private List<Shape> circles; 

     public CirclePane() { 
      circles = new ArrayList<>(25); 
     } 

     public void addCircle() { 
      int width = getWidth() - 1; 
      int height = getHeight() - 1; 
      int radius = (int) Math.round(Math.random() * (Math.min(width, height)/4f)); 
      int x = (int) Math.round(Math.random() * getWidth()); 
      int y = (int) Math.round(Math.random() * getHeight()); 
      if (x + radius > width) { 
       x = width - radius; 
      } 
      if (y + radius > height) { 
       y = height - radius; 
      } 
      circles.add(new Ellipse2D.Float(x, y, radius, radius)); 
      repaint(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int width = getWidth() - 1; 
      int height = getHeight() - 1; 
      for (Shape shape : circles) { 
       g2d.draw(shape); 
      } 
      g2d.dispose(); 
     } 

    } 

}