Java 加载所有组件后执行代码块
我有一个与串口通信的程序。Java 加载所有组件后执行代码块,java,swing,Java,Swing,我有一个与串口通信的程序。 这个串行端口程序涉及线程 我正在显示一个swing帧以显示串行端口的状态。 问题是当我调用setVisible(true)时,窗口没有完全加载。 在窗口完成加载后,我尝试使用isValid()来启动串行端口脚本,但始终没有成功 我想在窗口完成加载后启动串行端口脚本。 我如何克服这个问题 //Code used to call setVisible() form_objects.cardPayment.setVisible(true); if (form_obje
这个串行端口程序涉及线程 我正在显示一个swing帧以显示串行端口的状态。
问题是当我调用
setVisible(true)
时,窗口没有完全加载。在窗口完成加载后,我尝试使用
isValid()
来启动串行端口脚本,但始终没有成功
我想在窗口完成加载后启动串行端口脚本。我如何克服这个问题
//Code used to call setVisible()
form_objects.cardPayment.setVisible(true);
if (form_objects.cardPayment.isValid()) {
openPort.sendMessage(global_variables.port, "@PL\r");
String readMessage = openPort.readMessage(global_variables.port);
System.out.println(readMessage);
String check_bit[] = readMessage.split(",");
System.out.println(check_bit[2]);
if (check_bit[0].equalsIgnoreCase("@PL") &&check_bit[2].trim().equals("0")) {
card_payment.card_text.setText("Swipe Card");
openPort.sendMessage(global_variables.port, "@PU," + amount + ",,,,1\r");
boolean loop = true;
while (loop) {
openPort.sendMessage(global_variables.port, "@SR,1,131\r");
readMessage = openPort.readMessage(global_variables.port);
if (readMessage.equalsIgnoreCase("Timeout")) {
card_payment.card_text.setText("Enter Pin");
}
if (!readMessage.equals("") && !readMessage.equals("Timeout")) {
loop = false;
}
}
String sr[] = readMessage.split(",");
if (sr[1].equals("1") && sr[5].equals("")) {
System.out.println("Cancelled");
card_payment.card_text.setText("Payment Cancelled");
form_objects.cardPayment.dispose();
} else if (sr[1].equals("1") && sr[5].equals("T")) {
System.out.println("Accepted");
card_payment.card_text.setText("Accepted");
long ptime = Calendar.getInstance().getTimeInMillis();
while(ptime+10000>=Calendar.getInstance().getTimeInMillis()){
//do nothing just stay thhere for 10 seconds
}
form_objects.cardPayment.dispose();
} else if (sr[1].equals("1") && sr[5].equals("F")) {
System.out.println("Declined");
card_payment.card_text.setText("Payment Declined");
}
} else {
System.out.println("terminal offline");
}
}
--用于读取和写入使用thread.sleep()的端口的代码---
在同一线程中调用form_objects.cardPayment.setVisible(true)
,您也在调用而(true){
这将绑定您的Swing应用程序,直到端口代码完成它的工作
你需要阅读背景线程的使用,因为你似乎在Swing线程上做所有的事情。查看SwingWorker对象的使用。例如
编辑1:
如果你仍然被困,考虑创建和张贴,也许甚至作为这个线程中的答案或你的问题的补充,(请看链接)。这可能需要比典型的SSCCE稍长一点,而且会有点棘手,因为您必须模拟一些后台过程——足以重现您的问题——但可以帮助我们找到解决方案。在您调用form_objects.cardPayment.setVisible(true)的同一线程中;
,您也在调用而(true){
这将绑定您的Swing应用程序,直到端口代码完成它的工作
你需要阅读背景线程的使用,因为你似乎在Swing线程上做所有的事情。查看SwingWorker对象的使用。例如
编辑1:
如果你仍然被困,考虑创建和张贴,也许甚至作为这个线程中的答案或你的问题的补充,(请看链接)。这可能需要比典型的SSCCE稍长一点,而且会有点棘手,因为您必须模拟一些后台过程——足以重现您的问题——但可以帮助我们找到解决方案。我想知道您的问题是否真的是关于捆绑主Swing线程、EDT以及您需要使用background threading,这样串行端口代码就不会阻止Swing。另外,在顶级窗口上调用pack()之前,是否要将所有组件添加到GUI?是否使用SwingUtilities.invokeLater(…)在EDT上启动Swing代码?你能告诉我们关于你的程序的更多信息并显示关键代码吗?请检查我的编辑…很抱歉我的格式设置不好。我无法正确理解:(Deekpak,一个问题(与你的问题不完全相关)是你的代码试图同时完成所有工作。你混合了Swing、串行端口(通信)这是一个完美的(我真的是指完美的)灾难配方。不,这是关于如何将GUI逻辑和应用程序逻辑分开的问题,换句话说,GUI是一个问题(带有“请等待…”)这与通过RS232的数据流无关,将其移动到后台任务只需注意,如果要使用Executor.execute(SwingWorkerClass)看看前25个bug,但我认为这个bug是关于由Executor打开/限制的最大线程过载…我想知道你的问题是否真的是关于绑定主Swing线程,EDT,以及你需要使用后台线程,这样你的串行端口代码就不会阻塞Swing。另外,你是否在c之前将所有组件添加到GUI顶层窗口上的alling pack()?您是否正在使用SwingUtilities.invokeLater(…)在EDT上启动Swing代码?能否告诉我们有关您的程序的更多信息并显示关键代码?请检查我的编辑…很抱歉我的格式设置不好。我无法正确理解:(Deekpak,一个问题(与您的问题不完全相关)您的代码试图同时完成所有工作。您正在使用相同的方法混合Swing、串行端口(通信)和业务逻辑。这是一个完美的(我真正的意思是完美的)灾难配方。不是关于如何将GUI逻辑和应用程序逻辑分开的问题,换句话说,GUI是一个问题(带有“请等待…”)这与通过RS232的数据流无关,将其移动到后台任务只需注意,如果要使用Executor.execute(SwingWorkerClass)看看前25个bug,但我认为这个bug是关于由Executor打开/限制的最大线程数过载…检查我的编辑。当我包含编辑的最后一部分时,我的应用程序不执行串行端口部分。你能解释一下为什么会发生吗?谢谢你,我现在学到了一个新概念:)但我很乐意向您学习我编辑的最后一部分是如何工作的:)@Deepak:如果仍然卡住,请查看我的编辑1:以上。检查我的编辑。当我包含编辑的最后一部分时,我的应用程序不执行串行端口部分。你能解释一下为什么会发生这种情况吗?谢谢你,我现在学到了一个新概念:)但我很高兴向你学习编辑的最后一部分是如何工作的:)@Deepak:if仍然是塔克,请看我的编辑1:以上。
public static void sendMessage(SerialPort port, String msg) {
if (port != null) {
System.out.println(msg);
try {
byte[] bytes = msg.getBytes("US-ASCII");
try {
global_variables.outputStream.write(bytes);
System.out.println(bytes.length);
global_variables.outputStream.flush();
} catch (IOException ex) {
Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Opened successfully:" + msg.getBytes());
try {
Thread.sleep(2000); // Be sure data is xferred before closing
System.out.println("read called");
//byte b[] = new byte[1024];
//global_variables.inputStream.read(b);
//System.out.println("available" + global_variables.inputStream.available());
//SimpleRead read = new SimpleRead();
//int read = global_variables.inputStream.read();
//System.out.println("read call ended"+read);
} catch (Exception e) {
}
}
}
public static String readMessage(SerialPort port) {
byte[] buffer = new byte[1024];
int count=0;
try {
Thread.sleep(1000);
if (global_variables.inputStream.available() > 0) {
/*assigning it to count variable makes the read uniform. if we use available() each time the string are not processed fully.
* so assign it to count and use the count for rest of the buffer read operation
*/
count = global_variables.inputStream.available();
System.out.println("Data Available:" + count);
for (int i = 0; i < count; i++) {
buffer[i] = (byte) global_variables.inputStream.read();
}
String response = new String(buffer, 0, count);
return response;
} else {
return "Timeout";
}
} catch (InterruptedException ex) {
Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex);
}
return "timeout";
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
form_objects.cardPayment.setVisible(true);
}
});