关于多个按钮更改程序执行状态的实验
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");
}
}
刚开始我也是一直想怎样用多线程实现这个状态变化,终于明白了。我们要向实现状态变化,就不能让我们的对象在监听事件里一直执行。我们只有把主体的对象执行流,放在监听事件之外,这样才不会卡死其他按钮监听事件。也就是说,我们不能在按钮事件中实现太多的代码,尽量简化才行。如果这样的话,那我们就只把状态标识的赋值放到按钮监听事件中,这样就不会出现其他按钮卡死的状态。而我们的主体对象执行流,放在监听事件线程之外,循环检测状态标识运行。两个线程同时运行,不用担心死锁同步问题,因为我们就是要让程序在两个线程中同时读写。其实准确说是一个写,一个读。
开始我还想怎么设计个锁,后来发现没必要,好像锁了也不好同步。例子如下:
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");
}
}
相关文章推荐
- IOS开发(104)之程序执行状态更改
- IOS开发(104)之程序执行状态更改
- IOS开发之程序执行状态更改
- 【实验二】进程的创建与可执行程序的加载
- 解决this.disabled=true;不能执行服务器端代码的问题(点击后按钮变不可用状态)
- 关于网络上下载开源程序的无法编译执行的解决办法
- Linux内核如何装载和启动一个可执行程序-----实验7
- 关于将java程序打包成可执行exe文件过程需要注意事项
- 关于逆向工程程序执行成功但是代码没有生成问题
- vs2013版MFC按钮点击无反应,执行不到相应的事件处理程序
- 关于王爽老师实验实验八 (分析一个奇怪的程序)之个人解析
- 关于button按钮响应的三种写法和ImageButton判断状态
- C#按钮事件中有循环,用另一个按钮控制停止,暂停,继续程序执行
- 关于未安装vc情况下运行执行程序方法
- VC 关于windows服务状态更改
- 关于在IISserver上执行asp.net Web程序出现以下 “Could not load file or assembly。。。”问题的
- 关于Python的第三方库requests关闭SSL验证后,依然警告致使程序无法执行问题
- 微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
- 关于程序执行效率(数组,list)
- 关于Python中并发调用管道执行外部程序的问题解决