У меня есть код апплета, как показано ниже. У меня есть строка, называемая 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;
}
}
Вы можете попробовать его с [Observer-шаблон] (http://en.wikipedia.org/wiki/Observer_pattern). –
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. –