您的位置:首页 > 其它

关于多个按钮更改程序执行状态的实验

2017-10-31 23:04 218 查看
本来我写了界面,每个按钮的监听事件里写了好多代码,然后执行的时候按下按钮对对象进行操作。本来想法是一个按钮执行对象的具体流程,然后我们在另一个按钮里设置一个状态标识。这样,我们想改变程序状态时,只要按下改变程序状态的按钮就行了。但是,事实上这样行不通。在windowsbuilder建立的窗口上,我们的监听事件是建立在一个EventQueue.invokeLater  run()上的建立的线程上的,我们的把对象执行流程主题放在一个监听按钮上时,我们其他的按钮根本就不能执行。出现锁死状态,也就是说,我们这样的设计根本实现不了对象执行的多状态,反而在对象执行过程中锁死一个按钮,导致他根本没用。

     刚开始我也是一直想怎样用多线程实现这个状态变化,终于明白了。我们要向实现状态变化,就不能让我们的对象在监听事件里一直执行。我们只有把主体的对象执行流,放在监听事件之外,这样才不会卡死其他按钮监听事件。也就是说,我们不能在按钮事件中实现太多的代码,尽量简化才行。如果这样的话,那我们就只把状态标识的赋值放到按钮监听事件中,这样就不会出现其他按钮卡死的状态。而我们的主体对象执行流,放在监听事件线程之外,循环检测状态标识运行。两个线程同时运行,不用担心死锁同步问题,因为我们就是要让程序在两个线程中同时读写。其实准确说是一个写,一个读。

开始我还想怎么设计个锁,后来发现没必要,好像锁了也不好同步。例子如下:

package loginjsonclient;

import java.awt.EventQueue;

import javax.swing.JFrame;

import javax.swing.JButton;

import javax.swing.JTextPane;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Testconsole {

    private JFrame frame;

    static int num=0;

    static String stat="";

    static JTextArea textArea;

    /**

     * Launch the application.

     */

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                try {

                    Testconsole window = new Testconsole();

                    window.frame.setVisible(true);

                } catch (Exception e) {

                    e.printStackTrace();

                }    

            }

        });

        while(true){

            switch(stat)

            {

            case "add1":

                num++;

                stat="";

                break;

            case "add2":

                num++;

  
4000
              num++;

                stat="";

                break;

            case "add3":

                num=num+3;

                stat="";

                break;

            default:

            }

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            show(String.valueOf(num));

        }

    }

    /**

     * Create the application.

     */

    public Testconsole() {

        initialize();

    }

    /**

     * Initialize the contents of the frame.

     */

    private void initialize() {

        frame = new JFrame();

        frame.setBounds(100, 100, 450, 300);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().setLayout(null);

        

        JButton jbadd1 = new JButton("\u52A01");

        jbadd1.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                stat="add1";

            }

        });

        jbadd1.setBounds(45, 28, 113, 27);

        frame.getContentPane().add(jbadd1);

        

        JButton jbadd2 = new JButton("\u52A02");

        jbadd2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                stat="add2";

            }

        });

        jbadd2.setBounds(45, 101, 113, 27);

        frame.getContentPane().add(jbadd2);

        

        JButton button = new JButton("\u52A03");

        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                stat="add3";

            }

        });

        button.setBounds(45, 178, 113, 27);

        frame.getContentPane().add(button);

        

        JScrollPane scrollPane = new JScrollPane();

        scrollPane.setBounds(207, 13, 211, 198);

        frame.getContentPane().add(scrollPane);

        

        textArea = new JTextArea();

        scrollPane.setViewportView(textArea);

    }

    public static void show(String str)

    {

        textArea.append(str);

        textArea.append("\r\n");

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: