Java jbutton不起作用

Java jbutton不起作用,java,swing,awt,jbutton,Java,Swing,Awt,Jbutton,嗨,我有下面的代码,我有一个开始和停止按钮。当按下开始按钮时,画布开始绘制,但在开始操作完成之前,我无法按下停止按钮。我需要停下来继续按按钮上的油漆。按下“开始”按钮后,在绘制画布之前,无法按下其他按钮 导入java.awt.BorderLayout; 导入java.awt.Color; 导入java.awt.FlowLayout; 导入java.awt.GridLayout; 导入java.awt.Toolkit; 导入java.awt.event.ActionEvent; 导入java.a

嗨,我有下面的代码,我有一个开始和停止按钮。当按下开始按钮时,画布开始绘制,但在开始操作完成之前,我无法按下停止按钮。我需要停下来继续按按钮上的油漆。按下“开始”按钮后,在绘制画布之前,无法按下其他按钮


导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.FlowLayout;
导入java.awt.GridLayout;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入java.util.Hashtable;
导入javax.swing.DefaultComboxModel;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.Timer;
公共抽象类JUIApp扩展了JPanel实现ActionListener{
公共静态CACanvas CACanvas=null;
公共阵列主义流派;
公共JFrame=null;
受保护的JPanel主面板=空;
私有JButton btn0=null;
私有JButton btn1=null;
私有JButton btn2=null;
@抑制警告(“原始类型”)
DefaultComboxModel规则=null;
@抑制警告(“原始类型”)
JComboBox rulesCombo=null;
JScrollPane ruleListScrollPane=null;
JLabel标签=空;
JTextField generation=null;
JLabel gLable=null;
公共静态字符串规则;
公共静态字符串生成;
公共布尔值isChanged=false;
公共int gridCellSize=4;
私有静态最终长serialVersionUID=1L;
公共电流=0;
公共电流=0;
公共国际一级;
公共颜色cellColor=null;
公共定时器;
公共静态标志;
公共静态布尔alert1Flag=false;
公共布尔stopFlag=false;
public JLabel Alert1=新JLabel();
公共int genCheck=0;
//私有列表单元格;
公共JUIApp(){
initGUI();
}
public void initGUI(){
//fillCells=新阵列列表(25);
frame=新的JFrame();
frame.setTitle(“细胞自动机演示”);
框架设置尺寸(1050610);
frame.setresizeable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(getMainPanel(),BorderLayout.NORTH);
frame.setVisible(true);
Toolkit.getDefaultToolkit().setDynamicLayeout(false);
cacanvas=新的cacanvas();
框架。添加(cacanvas);
}
@SuppressWarnings({“unchecked”,“rawtypes”})
公共JPanel getMainPanel(){
mainPanel=新的JPanel();
mainPanel.setLayout(新的FlowLayout());
//cacanvas=新的cacanvas();
btn0=新的JButton(“开始”);
btn0.addActionListener(此);
//waitTimer=新计时器(1000,此);
主面板。添加(btn0);
JButton btn2=新JButton(“停止”);
btn2.addActionListener(新的ActionListener(){
已执行的公共无效操作(操作事件)
{
stopFlag=true;
//cacanvas.repaint();
}
});
主面板。添加(btn2);
btn1=新的按钮(“清除”);
btn1.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e)
{
CACanvas.clearFlag=true;
generation.setText(“”);
alert1Flag=true;
规则mbo.setSelectedIndex(0);
Alert1.setText(“请输入代数”);
警报1.倒退(30,20,5,5);
Alert1.setVisible(alert1Flag);
主面板。添加(警报1);
cacanvas.repaint();
帧设置大小(1060610);
}
});
主面板。添加(btn1);
标签=新的JLabel();
lable.setText(“选择规则:”);
主面板。添加(标签);
规则=新的DefaultComboxModel();

对于(int i=0;i似乎您正在该任务中使用当前线程,您应该创建另一个线程并向新线程添加一个侦听器代码。

可能的原因是,您正在阻止事件调度线程,该线程负责处理绘制事件。您可以使用Swing
计时器或
SwingWorkr
来解决这个问题。有关更多详细信息,请参阅和感谢您的回复。我已经阅读了并发注释,但是用一个示例来解释这个概念会容易得多。我是初学者,所以您是否介意用几行并发概念来编辑上面的代码。因为您的代码不完整,不可编译或运行,所以很难若要就如何最好地实施这两种解决方案中的任何一种提出建议,以便更快地获得更好的帮助,请发布或。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Hashtable;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.Timer;


public abstract class JUIApp extends JPanel implements ActionListener {
    public static CACanvas cacanvas= null;
    public ArrayList<int[]> genL;
    public JFrame frame = null;
    protected JPanel mainPanel = null;
    private JButton btn0 = null;
    private JButton btn1 = null;
    private JButton btn2 = null;
    @SuppressWarnings("rawtypes")
    DefaultComboBoxModel rules = null;
    @SuppressWarnings("rawtypes")
    JComboBox rulesCombo =null;
    JScrollPane ruleListScrollPane=null;
    JLabel lable=null;
    JTextField generation=null;
    JLabel gLable=null;
    public static String Rule;
    public  static String Generations;
    public boolean isChanged =false;
    public int gridCellSize=4;
    private static final long serialVersionUID = 1L;
    public int genCurrent=0;
    public int posCurrent=0;
    public int i;
    public Color cellColor= null;
    public Timer waitTimer;
    public static boolean waitFlag;
    public static boolean alert1Flag=false;
    public boolean stopFlag=false;
    public JLabel Alert1=new JLabel();
    public int genCheck=0;
    //private List<Point> fillCells;
    public JUIApp() {
        initGUI();

    }
    public void initGUI() {
        //fillCells = new ArrayList<>(25);
        frame = new JFrame();
        frame.setTitle("Cellular Automata Demo");
        frame.setSize(1050, 610);
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new BorderLayout());
        frame.add(getMainPanel(),BorderLayout.NORTH);
        frame.setVisible(true);
        Toolkit.getDefaultToolkit().setDynamicLayout(false); 
         cacanvas=new CACanvas();
            frame.add(cacanvas);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public JPanel getMainPanel() {
        mainPanel = new JPanel();
        mainPanel.setLayout(new FlowLayout());
        //cacanvas=new CACanvas();

        btn0 = new JButton("Start");
        btn0.addActionListener(this);
        //waitTimer = new Timer(1000, this);
        mainPanel.add(btn0);

        JButton btn2 = new JButton("Stop");
        btn2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent s)
            {
                stopFlag=true;
                //cacanvas.repaint();
            }
        });
        mainPanel.add(btn2);
        btn1 = new JButton("Clear");
        btn1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                CACanvas.clearFlag=true;
                generation.setText("");
                alert1Flag=true;
                rulesCombo.setSelectedIndex(0);
                  Alert1.setText("Please enter the number of generations");
                  Alert1.setBounds(30, 20, 5, 5);
                  Alert1.setVisible(alert1Flag);
                  mainPanel.add(Alert1);
                   cacanvas.repaint();
                   frame.setSize(1060, 610);

            }
    });
        mainPanel.add(btn1);
        lable=new JLabel();
        lable.setText("Select Rule :");
        mainPanel.add(lable);
        rules=new DefaultComboBoxModel();
        for (int i=0;i<=100;i++)
        {
            String p=String.valueOf(i);
        rules.addElement(p);
        }
        rules.addElement("250");
        rules.addElement("254");
        rulesCombo = new JComboBox(rules);    
        rulesCombo.setSelectedIndex(0);

         ruleListScrollPane = new JScrollPane(rulesCombo);
        mainPanel.add(ruleListScrollPane);
        //mainPanel.revalidate();
        gLable=new JLabel();
        gLable.setText("Enter the number of Generations (Max 64)");
        generation=new JTextField(2);

        mainPanel.add(gLable);
        mainPanel.add(generation);
       // mainPanel.add(cacanvas);
        return mainPanel;
    }


    public abstract void run();

    @Override
    public void actionPerformed(ActionEvent arg0) {
        Alert1.setVisible(false);
        waitFlag=false;
        System.out.println("We received an ActionEvent " + arg0);
         Generations=generation.getText();
        System.out.println(Generations);

         Rule = "";
        if (rulesCombo.getSelectedIndex() != -1) {                     
           Rule = 
                   (String) rulesCombo.getItemAt
                (rulesCombo.getSelectedIndex());             
        } 
        System.out.println(Rule);
        int rule=Integer.parseInt(Rule);
     Hashtable<String,Integer> rules= new Hashtable<String,Integer>();
        CARule ruleClass=new CARule();
        rules=ruleClass.setRule(rule);
        CAGenetationSet sa =new CAGenetationSet(100, false,rules);
         genL=new ArrayList<int[]>();
         genL=sa.runSteps(Integer.parseInt(Generations));
         System.out.println("calling pattern set");
        for(int i=0;i<=genL.size()-1;i++)
        {
            System.out.println("Painting generation :"+i);

            if(stopFlag==false)
            {

               cacanvas.repaint();
            }

            //genPaint();
            //sleep();
            int[] newCell=genL.get(i);
            for(int r=0;r<newCell.length;r++)
            {

                if(newCell[r]==1)
                {


                    System.out.println("Generaton is"+i+"CellLife is"+r);
                    cacanvas.fillCell(i,r);


        }
            }

        }




                    /*cacanvas.patternSet(genL);
                    waitFlag=true;


                  System.out.println("run completed");
                 // cacanvas.clearFlag=true;
*/  
    }   

    public void genPaint()
    {
        cacanvas.repaint();
    }

    public void sleep()
    {
        try
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
        JUIApp app = new JUIApp() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("Run method");

            }



    };
}
}