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);
                }
            });