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

    } 

}