我想每次单击按钮“ bouton”来执行功能

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

    }

    }

最佳答案

尝试这个:

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成为类成员变量
仅调用一次window2()
创建用于更新圈子的方法updateWindow2()。从window2()和actionPerformed()调用该方法。

08-19 13:51