2014-02-17 2 views
2

У меня есть код апплета, как показано ниже. У меня есть строка, называемая String randomNumberStr в этом апплете, чтобы отобразить случайное число, полученное с сервера сокетов. После отображения окна Applet у меня есть кнопка «Connect». Нажатие на эту кнопку будет подключаться к программе Socket и получает строку Random Number.Обновление строки из основной строки в основной динамически в Applet

Моя проблема, я бег кода подключения сокетов в отдельном потоке SocketConnectionThread в этом апплете, Но, String randomNumberStr и repaint функции есть в основном потоке.

Как я могу получить и передать значение случайного числа из этой темы SocketConnectionThread в основное меню и перерисовать окно апплета?

public class CobrowseApplet extends Applet implements ActionListener 
{ 
    private static final long serialVersionUID = 1L; 
    String titleStr ; 
    String randomNumberStr; 
    Image sharedImage; 
    BufferedImage image; 
    private Button connectBtn; 
    Socket localSocket; 
    PrintWriter out; 
    BufferedReader in; 
    static Timer timer; 
    int delay = 1000; 
    int period = 1000; 
    DataInputStream inStream; 
    PrintStream outStream; 
    InputStream input; 

    public void init(){ 
     titleStr = "Welcome"; 
     randomNumberStr = ""; 

     connectBtn = new Button("Connect"); 

     connectBtn.addActionListener(this); 
     add(connectBtn); 
     connectBtn.setBounds(200, 50, 90, 20); 
     connectBtn.setEnabled(true); 
     setLayout(null); 

     setSize(550, 650); 
    } 
    public void paint (final Graphics g) 
    { 
     //super.paint(g); 
     int x = getSize().width; 
     int c1 = x/2; 
     g.drawString(titleStr, c1-100, 20); 
     g.drawString(randomNumberStr, c1-100, 80); 
     System.out.println("sharedImage" + sharedImage); 
     //g.drawImage(sharedImage, 100, 100, this); 
     System.out.println("drawImage"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     Thread thr = new Thread(new SocketConnectionThread(randomNumberStr)); 
     thr.start(); 


     if (connectBtn.getLabel()=="Connect") 
     { 
      connectBtn.setLabel(""); 
      connectBtn.setLabel("Disconnect"); 
     } 
     else 
     { 
      connectBtn.setLabel(""); 
      connectBtn.setLabel("Connect"); 
     } 
     System.out.println("randomNumberStr: " + randomNumberStr); 

     repaint(); 
    } 

} 

class SocketConnectionThread implements Runnable { 

    String randomStr; 

    public SocketConnectionThread(String randomNumberStr) { 
     this.randomStr = randomNumberStr; 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     try { 
      System.out.println("Before Applet socket connection"); 

      Socket localSocket = new Socket(getLocalIP(), 8080); 

      BufferedReader socketReader = new BufferedReader(new InputStreamReader(localSocket.getInputStream())); 
      String msgStr = socketReader.readLine(); 
      System.out.println("Server Message on Client: " + msgStr); 

      // IT GETS THE NEW STRING HERE FROM SOCKET. HOW CAN I PUSH TO MAIN? 
      randomStr = msgStr; 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
    String getLocalIP() { 
     InetAddress inetAddress = null; 
     String ipAddress = null; 
     try { 
      inetAddress = InetAddress.getLocalHost(); 
      ipAddress = inetAddress.getHostAddress(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("ipAddress : " + ipAddress); 

     return ipAddress; 
    } 

} 
+0

Вы можете попробовать его с [Observer-шаблон] (http://en.wikipedia.org/wiki/Observer_pattern). –

+0

1) Зачем нужен апплет? Если это связано со спецификацией. учителем, пожалуйста, обратитесь к [Почему учителя CS должны прекратить преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/). 2) Почему AWT, а не Swing? См. Мой ответ на [Swing extras over AWT] (http://stackoverflow.com/a/6255978/418556) по многим причинам, чтобы отказаться от использования компонентов AWT. –

ответ

0

Для сравнения объектов в Java используют .equals() метод вместо того, чтобы оператор "=="

Заменить следующий код

if (connectBtn.getLabel()=="Connect") 

к

if ("Connect".equals.(connectBtn.getLabel())) 
0

Строки неизменен в java. И если вы измените строку в SocketConnectionThread, обновление не будет заметно в основном потоке. Вы можете попытаться обернуть свою строку с помощью AtomicReference. Таким образом, вы можете изменить значение в своем SocketConnectionThread, и основной поток всегда будет видеть правильное значение.

Лучшее решение для перевода вашего SocketConnectionThread на SwingWorker. Вы прочитаете сокет в методе doInBackground() и обновите GUI в методе done().

+0

Мне также нужно получить данные изображения из сокета и обновить в основном потоке drawImage. Итак, пожалуйста, сообщите, какой должен быть легкий и лучший подход для доступа к «Строке», а также «Байт-данные» в главной теме (перекраска окон) из потока Socket. Я не знаю, как использовать AtomicReference в моем случае. – Stella

+0

Я бы использовал SwingWorker. Посмотрите этот старый учебник: http://www.oracle.com/technetwork/articles/javase/swingworker-137249.html#ImageRetriever – Kojotak

+0

О, мне нужно, чтобы апплет был расширен, я должен использовать апплет. – Stella

0

Вы можете попробовать его с Observer-Pattern:

public class CobrowseApplet extends Applet implements ActionListener, Observer { 

    @Override 
    public void update(Observable obs, Object obj) { 
     String randomNumberStr = String.valueOf(obj); 
     System.out.println("randomNumberStr: " + randomNumberStr); 
     repaint(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     SocketConnectionThread sct = new SocketConnectionThread(randomNumberStr); 
     Thread thr = new Thread(sct); 
     sct.addObserver(this); 
     thr.start(); 
     // ... 
    } 

    // your code here 

} 

class SocketConnectionThread extends Observable implements Runnable { 

    List<Observer> observer; 

    public SocketConnectionThread(String randomNumberStr) { 
     this.randomStr = randomNumberStr; 
     observer = new LinkedList<Observer>(); 
    } 

    public void addObserver(Observer obs) { 
     observer.add(obs); 
    } 

    @Override 
    public void run() { 
     // ... 
     randomStr = msgStr; 
     notifyObservers(randomStr); 
     // ... 
    } 

    // your code here 

} 
Смежные вопросы