2014-03-27 125 views
0

欲每次我點擊按鈕「布頓」來執行該功能的actionPerformed跳過步驟

boutonPane.Panel2(H,....)這是應該顯示H圓。所以我想2然後3然後4,然後5 ...圈子。

問題是它沒有顯示數字4的步驟。我看到該功能在控制檯中調用,但它在屏幕上確實是2,(按下按鈕)3,(按下按鈕)5,(按下按鈕)9。我沒有看到4.我沒有看到6,7,8 ..你能告訴我什麼是問題嗎?下面是代碼:

public class Window extends JFrame implements ActionListener { 
     int lg = 1000; int lrg = 700; 
     int h = 2; 

     Panel b = new Panel(); 

     private JButton btn = new JButton("Start"); 

     JButton bouton = new JButton(); 

     private JPanel container = new JPanel(); 

     public Window(){ 
      this.setTitle("Animation"); 
      this.setSize(300, 300); 
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      this.setLocationRelativeTo(null); 
      container.setBackground(Color.white); 
      container.setLayout(new BorderLayout()); 
      JPanel top = new JPanel(); 

      btn.addActionListener(this); 
      top.add(btn); 
      container.add(top); 
      this.setContentPane(container); 
      this.setVisible(true); 
     } 

     public void Window2() 
     { 

      System.out.println("windows2"); 

      this.setTitle("ADHD"); 
      this.setSize(lg, lrg); 
      this.setLocationRelativeTo(null); 

      bouton.addActionListener(this); 


      if(h<11) 
      { 
       Panel boutonPane = new Panel(); 
       boutonPane.Panel2(h, Color.BLUE ,lg, lrg, this.getGraphics()); 

       System.out.println("draw"+h); 

       boutonPane.add(bouton); 

       this.add(boutonPane); 
       this.setContentPane(boutonPane); 
       this.revalidate(); 
       this.repaint(); 

      } 


      this.setVisible(true); 

     } 




     public void actionPerformed(ActionEvent e) 
     { 
      if((JButton)e.getSource()==btn) 
      { 
       System.out.println("pressed0"); 
       Window2(); 

      } 
      if((JButton)e.getSource()==bouton) 
      { 
       h++; 
       System.out.println("pressed"+h); 
       Window2(); 

      } 
     } 
    } 

下面是一個Panel類:

public class Panel extends JPanel 
{ 

    int m; 
    int i=1; 

    int a=0, b=0, tremp=0; 
    Color cc; 
    int lgi, lrgi; 
    int [] ta; 
    int [] tb; 

    Graphics gi; 

    int u=0; 

    Panel() 
    { 

    } 

    public void Panel2(int n, Color c, int lg, int lrg, Graphics g){ 
     m=n; 
     cc=c; 
     gi=g; 
     lgi=lg; 
     lrgi=lrg; 
     ta = new int [n]; ta[0]=0; 
     tb = new int [n]; tb[0]=0; 

    } 

    public void paintComponent(final Graphics gr){ 

     gr.setColor(Color.red); 

     for(int it=0; it<m;it++) 
     { 
      ta[it]=100*it; 
      tb[it]=100*it; 
      gr.fillOval(ta[it],tb[it], 150, 150); 
     } 

    } 

    } 
+0

我希望現在編輯正確。有人有我的問題的答案嗎? – user3460225

回答

1

試試這個:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Window extends JFrame implements ActionListener 
{ 
    int lg = 1000; 
    int lrg = 700; 
    int h = 2; 

    Panel b = new Panel(); 

    private JButton btn = new JButton("Start"); 

    JButton bouton = new JButton(); 

    private JPanel container = new JPanel(); 
    Panel boutonPane = new Panel(); 

    public Window() 
    { 
     this.setTitle("Animation"); 
     this.setSize(300, 300); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setLocationRelativeTo(null); 
     container.setBackground(Color.white); 
     container.setLayout(new BorderLayout()); 
     JPanel top = new JPanel(); 

     btn.addActionListener(this); 
     top.add(btn); 
     container.add(top); 
     this.setContentPane(container); 
     this.setVisible(true); 
    } 

    public void Window2() 
    { 

     System.out.println("windows2"); 

     this.setTitle("ADHD"); 
     this.setSize(lg, lrg); 
     this.setLocationRelativeTo(null); 

     bouton.addActionListener(this); 

     if (h < 11) 
     { 

     boutonPane.Panel2(h, Color.BLUE, lg, lrg, this.getGraphics()); 

     System.out.println("draw" + h); 

     boutonPane.add(bouton); 

     this.add(boutonPane); 
     this.setContentPane(boutonPane); 
     updateWindow2(); 

     } 

     this.setVisible(true); 

    } 

    public void updateWindow2() 
    { 
     boutonPane.Panel2(h, Color.BLUE, lg, lrg, this.getGraphics()); 
     this.revalidate(); 
     this.repaint(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     if ((JButton) e.getSource() == btn) 
     { 
     System.out.println("pressed0"); 
     Window2(); 

     } 
     if ((JButton) e.getSource() == bouton) 
     { 
     h++; 
     System.out.println("pressed" + h); 
     updateWindow2(); 

     } 
    } 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
    } 
} 

你是錯的是你每次點擊時添加什麼新的BoutonPane按鈕。下次單擊該按鈕時,您沒有單擊一個按鈕,而是兩個按鈕,再添加兩個boutonPanes和另外兩個按鈕。這種增長很快。

我所做的是以下幾點:

  • 使boutonPane類成員變量
  • 調用窗口2()只有一次
  • 創建用於更新圈子的方法updateWindow2()。從window2()和actionPerformed()調用該方法。
+0

它的工作!非常感謝!! – user3460225

+0

接受答案將不勝感激;) –

+0

我做了一個簡單版本的面板,但與我真正使用它不起作用。我可以發送代碼,但它使用項目的其他類和圖片。你會建議我做什麼?發送一切,但圖片? – user3460225

2

「但是你會想出另一種正確的方法來做我想要的嗎?

  • 您應該只有一個面板爲界。有絕對不需要不斷創建新面板。

  • 對於Ellipse2D對象使用List。只需在paintComponent方法中循環瀏覽它們即可。

  • 當你想添加一個新的圈子,只需添加一個新Ellipse2D對象的List並調用repaint()

下面是一個例子。

注意接受Gijs Overvliet的答案,因爲他是解決問題的人。我只是想分享一些見解。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
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.SwingUtilities; 

public class EllipseList extends JPanel { 

    private static final int D_W = 700; 
    private static final int D_H = 500; 
    private static final int CIRCLE_SIZE = 50; 

    private List<Ellipse2D> circles; 
    private double x = 0; 
    private double y = 0; 

    private CirclePanel circlePanel = new CirclePanel(); 

    public EllipseList() { 
     circles = new ArrayList<>(); 

     JButton jbtAdd = createButton(); 
     JFrame frame = new JFrame(); 
     frame.add(jbtAdd, BorderLayout.NORTH); 
     frame.add(circlePanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JButton createButton() { 
     JButton button = new JButton("Add"); 
     button.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       circles.add(new Ellipse2D.Double(x, y, CIRCLE_SIZE, CIRCLE_SIZE)); 
       x += CIRCLE_SIZE * 0.75; 
       y += CIRCLE_SIZE * 0.75; 
       circlePanel.repaint(); 
      } 
     }); 
     return button; 
    } 

    public class CirclePanel extends JPanel { 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D)g; 
      g2.setPaint(Color.RED); 
      for (Ellipse2D circle : circles) { 

       g2.fill(circle); 
      } 
     } 

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

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new EllipseList(); 
      } 
     }); 
    } 
} 
+0

問題是我做了我的班級面板的簡單版本,以便能夠在網站上發佈代碼。實際上,即使Gijs回答,它也不適合我的真實面板。我應該怎麼做?我可以向您發送我的真實面板的代碼,但它使用該項目的其他類和圖片。也許我可以給你發送該項目的文件夾? – user3460225