0

我目前正在制作一个程序,使用 RFID 来获取输入并使用 Java Swing 接口显示其信息。

我的问题是我创建了一个函数,它不断检查 RFID 中是否有输入并使用 Swing 显示它,但是我需要在应用程序启动时运行该函数。

*我尝试使用公共功能,但它不能使用jlabel.setText和其他功能,因为它是在静态上运行的。

我考虑添加一个启动按钮只是为了让轮子转动,但我不喜欢使用任何按钮,以便界面干净。

package com.domain.test;

import java.io.IOException;
import java.io.InputStream;

public class SerialReader implements Runnable {

    InputStream in;

    public SerialReader(InputStream in) {
        this.in = in;
    }

    public void run() {
        byte[] buffer = new byte[1024];
        String dataHolder;
        String IDnumber = new String();
        int incomingData = -1;
        int ctr = 0;
        try {

            while ((incomingData = this.in.read(buffer)) > -1) {
                dataHolder = new String(buffer, 0, incomingData);

                if (incomingData >= 1) {


                    ctr++;

                    IDnumber = IDnumber + dataHolder;
                    if (IDnumber.length()==14) {

                        System.out.println(IDnumber);
                        log display = new log();
                        display.setLabel(IDnumber.substring(1, IDnumber.length() - 1));
                        IDnumber = new String();
                        ctr = 0;

                    }

                } 

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我需要做的是将提交给这个函数的数据传递给这个 Swing 函数(setText)。

 public void setLabel(String studNum){
   sNum = studNum;
   jName.setText(sNum);
}

问题是我可以传递数据,但我不能用它来显示在我的界面上。这就是为什么我要问如何创建一个将在应用程序启动时运行的函数(可以与 Swing 通信)。

另外,如果您可以给我另一种方式来了解如何将数据传递给我的 Swing。

4

3 回答 3

2

您可以实施轮询以查找输入

来自http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

Swing 计时器(的一个实例 javax.swing.Timer)在指定的延迟后触发一个或多个动作事件。不要将 Swing 计时器与 1.3 版中添加到 java.util 包中的通用计时器工具混淆。本页仅描述 Swing 计时器。

一般来说,我们建议使用 Swing 计时器而不是通用计时器来处理与 GUI 相关的任务,因为 Swing 计时器都共享相同的、预先存在的计时器线程,并且与 GUI 相关的任务会自动在事件调度线程上执行。但是,如果您不打算从计时器触摸 GUI,或者需要执行冗长的处理,则可以使用通用计时器。

于 2013-01-17T10:44:15.453 回答
2

您需要一个线程、计时器或执行程序服务来启动并检查该 RFID 馈送。

为什么不能在创建应用程序时实例化并启动线程?我认为不需要按钮。

我不会在 Swing 线程上执行此操作。结果将呈现在 UI 中,但操作并不是真正的 Swing 问题。

于 2013-01-17T10:44:30.153 回答
0

首先,您需要一个单独的线程来渲染 GUI 以显示 IDNumber,以便在 GUI 渲染 IDNumber 时不会阻塞您的 Reader 线程。


其次,您需要同时显示 IDNumber 并从输入流中读取消息。


SwingWorker您可以通过使用提供的 API来实现上述两个要求Swing.

最后,为了确保 Reader 仅在 GUI(显示)启动后才开始运行,您需要volatile关键字,以便 JVM 在执行时不会以优化代码为借口更改代码顺序。


在这里,我发布了一个代码片段来实现所有这些。我希望它可能对你有所帮助。

import javax.swing.*;
import java.awt.*;
import java.util.List;
class SerialReader extends SwingWorker<Void,String>
{
    Log display ;
    String messages[] =     {
                    "Java supports OOPS!!",
                    "JRE is the bundle of JVM and java Class liberary",
                    "JVM executes the java bytecode.",
                    "JIT converts code at runtime prior to executing it natively",
                    "Stay here I'll be back after reading more about java!!!! :)"
                };
    private SerialReader(){}//To avoid construction of object without parameter
    public SerialReader(Log display)
    {   
        this.display = display;
    }
    @Override
    protected Void doInBackground()
    {
        try
        {
            //Reading Messages one by one till the end
            for(int i=0;i<messages.length;i++)
            {
                String message = messages[i];
                publish(message);
                Thread.sleep(600);//I have added this much delay in compensation to the time 
                        //that would be taken when u are formating data from inputstream.
            }           //You must sleep the Thread for at least 1 ms so that change in 
                        //display could be visualized.
        }catch(Exception ex){ex.printStackTrace();}
        finally
        {
            return null;
        }
    }

    @Override
    protected void process(List<String> chunks)
    {
        for(String msg: chunks)
        {
            display.setLabel(msg);
        }
    }

    @Override
    protected void done()
    {}
}
class Log extends JFrame
{
    private JLabel label = new JLabel("");
    public Log()
    {
        super("Display");
    }
    public void prepareAndDisplay()
    {
        getContentPane().setLayout(new FlowLayout());
        getContentPane().add(label);    
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,100);
        setVisible(true);
    }
    public void setLabel(final String value)
    {
        label.setText(value);
    }
}
public class MainClass 
{
    private static volatile Log log;
    private static volatile SerialReader reader;
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                log = new Log();
                log.prepareAndDisplay();
                log.setLabel("Display is ready Please Wait for incoming message...");
                try
                {
                    Thread.sleep(100);//Delayed the start of Reader by 100 ms
                }catch(Exception ex){}
                reader = new SerialReader(log);
                reader.execute();
            }       
        });                                 
    }
}


要了解有关SwingWorkerAPI 的更多信息,请单击此处。要了解如何使用,SwingWorker请单击此处

于 2013-01-18T20:36:58.183 回答