Swing应用程序启动时运行一个函数(私有)

时间:2013-01-17 10:41:31

标签: java swing oop netbeans

我目前正在制作一个程序,使用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。

3 个答案:

答案 0 :(得分:2)

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

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

  

Swing计时器(一个实例)   javax.swing.Timer)发射一个或多个   指定延迟后的动作事件。   不要混淆Swing计时器   通用计时器设施   被添加到java.util包中   发布1.3。本页仅介绍   摇摆计时器。

     

一般情况下,我们建议   使用Swing计时器而不是   与GUI相关的通用计时器   任务因为Swing计时器都共享   相同的,预先存在的计时器线程   和GUI相关的任务自动完成   在事件派发线程上执行。   但是,您可以使用   通用计时器,如果你不这样做   计划从触摸GUI   计时器,或需要执行冗长   处理

答案 1 :(得分:2)

您需要线程,计时器或执行程序服务来启动和检查该RFID源。

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

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

答案 2 :(得分:0)

  

首先,您需要一个单独的线程来呈现GUI   IDNumber,以便在GUI时不阻止您的Reader线程   渲染IDNumber。


  

其次,你需要同时显示IDNumber并阅读   来自输入流的消息。


您可以使用SwingWorker提供的Swing. API

来达到上述要求
  

最后确保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();
            }       
        });                                 
    }
}


要了解有关SwingWorker API的更多信息,请点击here。要了解如何使用SwingWorker点击here

相关问题