我有一个与串口通信的程序。
此串口程序涉及线程。加载所有组件后执行代码块
我正在显示一个摆动框架来显示串行端口的状态。
问题是我打电话给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");
}
}
--Code用于读取和写入它使用thread.sleep()
港口---
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";
}
当我使用的form_objects.cardPayment.setVisible(true)
的地方下面的代码我无法得到串口方法调用。
你们可以解释一下为什么会发生?
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
form_objects.cardPayment.setVisible(true);
}
});
我不得不怀疑你的问题是否真的是捆绑主要的Swing线程,EDT,以及你需要使用后台线程以便你的串口代码不会阻塞Swing。另外,在顶层窗口调用pack()之前是否将所有组件添加到了GUI中?您是否使用SwingUtilities.invokeLater(...)在EDT上启动Swing代码?你能告诉我们更多关于你的程序和显示关键代码吗? – 2011-04-30 18:23:13
检查我的编辑...抱歉我的可怜的格式。我无法得到它的权利:( – Deepak 2011-04-30 18:31:52
@奥古斯托:谢谢你verymuch !!! – Deepak 2011-04-30 18:37:48