2013-01-17 2 views
0

현재 입력을 받아 Java Swing Interface를 사용하여 정보를 표시하는 RFID를 사용하는 프로그램을 만들고 있습니다.스윙 응용 프로그램 시작시 기능 실행 (개인)

내 문제는 여기에 RFID에 입력이 있는지 계속 확인하고 스윙을 사용하여 표시하는 기능을 만들었지 만 응용 프로그램이 시작될 때 해당 기능을 실행해야합니다.

* 공용 함수를 사용해 보았지만 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(); 
     } 
    } 
} 

내가해야할 일은이 함수에 제출 된 데이터를 전달한 다음이 스윙 함수 (setText)에 전달하는 것입니다.

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

문제는 데이터를 전달할 수 있지만 내 인터페이스에는 표시 할 수 없다는 것입니다. 그래서 응용 프로그램이 시작될 때 실행할 함수 (Swing과 통신 할 수 있음)를 만드는 방법을 묻는 것입니다.

또한 내 스윙에 데이터를 전달하는 방법에 대해 다른 방법을 제공 할 수 있다면.

+0

실제 코드가 없으면이 질문에 대한 답변을 얻을 수 없습니다 ... 편집 버튼을 사용하여 질문에 입력하십시오. – ppeterka

+0

코드가 추가되었습니다. –

답변

2

당신은 http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

에서 입력

위한 스윙 타이머 ( javax.swing.Timer의 인스턴스)를보고 폴링을 구현할 수는 지정된 지연 후 하나 개 이상의 액션 이벤트를 발생시킵니다. 릴리즈 1.3의 java.util 패키지에 이 추가 된 범용 타이머 기능과 스윙 타이머를 혼동하지 마십시오. 이 페이지에서는 스윙 타이머에 대해서만 설명합니다. 일반적으로

, 우리는 GUI 관련 작업 사용하여 스윙 타이머보다는 범용 타이머를 추천하기 때문에 스윙 타이머 모두가 공유 같은, 기존의 타이머 스레드 와 GUI 관련 작업을 자동으로 이 실행 이벤트 발송 스레드에서. 타이머에서 GUI를 건드릴 계획이 없거나 처리 시간이 오래 걸리므로 처리를 수행해야하는 경우 범용 타이머를 사용할 수 있습니다.

+0

스윙 타이머를 알아 내려고 시도했습니다 ... –

+0

감사합니다. 덕분에 대답을 받아 들일 수 있습니다. – TheWhiteRabbit

2

해당 RFID 피드를 시작하고 확인하려면 스레드, 타이머 또는 실행 프로그램이 필요합니다.

왜 앱을 만들 때 스레드를 인스턴스화하고 시작할 수 없습니까? 나는 버튼이 필요 없다고 생각한다.

스윙 스레드에서이 작업을 수행하지 않습니다. 결과는 UI에서 렌더링되지만 작동은 진정으로 스윙 문제가 아닙니다.

0

은 우선 당신은 GUI가 IDNumber 렌더링 때 당신의 리더 스레드가 차단되지 않도록 IDNumber를 표시하도록 GUI를 렌더링하기위한 별도의 스레드가 필요합니다.


둘째, 당신은 동시 IDNumber의 디스플레이와 입력 스트림에서 메시지를 읽고이 필요합니다. 당신은 위의 모두 달성 할 수


리더는 GUI (디스플레이) 시작 후에 만 ​​실행을 시작 있는지 확인하기 위해 마지막으로 Swing.

그리고에 의해 제공 SwingWorker API를 사용하여 요구 사항, 당신은 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(); 
      }  
     });         
    } 
} 



here을 클릭 SwingWorker API에 대한 자세한 내용을 알고. SwingWorker을 사용하는 방법에 대해 알고 싶으시면 here을 클릭하십시오.