【发布时间】:2011-11-13 09:38:28
【问题描述】:
server.java
好的,所以问题是:当我点击开始按钮时,gui“冻结”,但服务器正在工作,我在控制台中有一个输出。我认为我应该使用线程,但我不知道如何实现它= /
void Runer() throws Exception
{
ServerSocket welcomeSocket = new ServerSocket(6789);
System.out.println("welcome into server");
while(true)
{
Socket connectionSocket = welcomeSocket.accept();
if (connectionSocket != null)
{
System.out.println(connectionSocket);
Client client = new Client(connectionSocket);
client.start();
}
}
}
}
class Client extends Thread
{
private Socket connectionSocket;
private String pozX;
private String ans;
private String pozY;
private String capitalizedSentence;
private BufferedReader inFromClient;
private DataOutputStream outToClient;
public Client(Socket c) throws IOException
{
connectionSocket = c;
}
public void run()
{
try
{
inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
outToClient = new DataOutputStream(connectionSocket.getOutputStream());
pozX = inFromClient.readLine();
pozY = inFromClient.readLine();
System.out.println(pozX);
System.out.println(pozY);
capitalizedSentence = pozX.toUpperCase() + '\n';
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
outToClient.writeBytes(capitalizedSentence);
}
catch(IOException e)
{
System.out.println("Errore: " + e);
}
}
gui.java
JPanel GuiServera(){
JPanel panel = new JPanel();
area = new JTextArea();
area.setColumns(20);
area.setRows(10);
area.setText("The log is logging injoy");
panel.setLayout(null);
start = new JButton("Start");
start.addActionListener(list);
panel.add(start);
stop = new JButton("Stop");
stop.addActionListener(list);
pane = new JButton("Admin Panel");
panel.add(stop);
panel.add(pane);
scrolled = new JScrollPane(area);
panel.add(scrolled);
Insets insets = panel.getInsets();
Dimension size = start.getPreferredSize();
start.setBounds(40 + insets.left, 20 + insets.top,
size.width, size.height);
size = stop.getPreferredSize();
stop.setBounds(40 + insets.left, 60 + insets.top,
size.width, size.height);
size = pane.getPreferredSize();
pane.setBounds(40 + insets.left, 100 + insets.top,
size.width, size.height);
size = scrolled.getPreferredSize();
scrolled.setBounds(160 + insets.left, 20 + insets.top,
size.width, size.height);
return panel;
}
class Nasluchiwacz implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==start){
System.out.println("start");
area.append("start button\n");
try {
inzServer.Runer();
} catch (Exception ex) {
Logger.getLogger(Gui.class.getName()).log(Level.SEVERE, null, ex);
}
}
else if (e.getSource()==stop){
area.setText(area.getText()+"\nstop\n");
}
}
}
【问题讨论】:
-
你自己回答了。您的 GUI 需要处理事件以响应用户交互。您需要在另一个线程上运行干扰 GUI 的东西以防止这种情况发生。这并不难,只需将代码放入 Runnable 实现中,然后 new Thread(runnable).start() 即可。如果您的线程需要与 GUI 交互,那么您需要了解 invokeLater() 和 invokeAndWait() 在 Swing 的事件调度线程上排队的东西。
-
panel.setLayout(null);不要那样做,学习如何使用布局(+填充和边框)。 -
我知道如何使用布局,我只是觉得绝对定位更方便
-
@iie:学习使用布局的方法就是使用它们。它们确实是不可或缺的。
-
'我知道如何使用布局,我只是觉得绝对定位更方便' - 这本身就是矛盾的 ;-)
标签: java swing user-interface network-programming concurrency