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

来源:互联网 发布:免费网络营销软件 编辑:程序博客网 时间:2024/06/05 08:47

本来我写了界面,每个按钮的监听事件里写了好多代码,然后执行的时候按下按钮对对象进行操作。本来想法是一个按钮执行对象的具体流程,然后我们在另一个按钮里设置一个状态标识。这样,我们想改变程序状态时,只要按下改变程序状态的按钮就行了。但是,事实上这样行不通。在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++;
                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");
    }
}

阅读全文
0 0