Java Gui在while循环中冻结
server.java 好的,所以问题是:当我点击开始按钮时,gui“冻结”,但服务器正在工作,我在控制台中有一个输出。我想我应该使用线程,但我不知道如何实现它=/Java Gui在while循环中冻结,java,swing,user-interface,network-programming,concurrency,Java,Swing,User Interface,Network Programming,Concurrency,server.java 好的,所以问题是:当我点击开始按钮时,gui“冻结”,但服务器正在工作,我在控制台中有一个输出。我想我应该使用线程,但我不知道如何实现它=/ void Runer() throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); System.out.println("welcome into server"); while(true) {
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();
}
}
}
}
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");
}
}
}
你几乎做对了。 而不是延伸线程。使其实现可运行 然后在你的课堂上。您可以选择创建新线程(inserver.start();
或者看看Executorservice或Swingworkers。你几乎做对了。 而不是延伸线程。使其实现可运行 然后在你的课堂上。您可以选择创建新线程(inserver.start();
或者看看Executorservice或swingWorker。您应该尝试使用swingWorker。
选中此复选框,您应该尝试使用swingWorker。
检查这个你自己已经回答了。GUI需要处理事件以响应用户交互。您需要在另一个线程上运行干扰GUI的东西来防止这种情况。这并不难,只需将代码放入可运行的实现中,然后添加新线程(Runnable).start()即可。如果您的线程需要与GUI交互,那么您需要了解InvokeLatter()和invokeAndWait(),它们在Swing的事件调度线程上排队代码>不要这样做,学习如何使用布局(+填充和边框)。我知道如何使用布局,我只是发现绝对定位更多handy@iie:了解如何使用布局的方法是使用它们。它们确实是不可或缺的。“我知道如何使用布局,我只是觉得绝对定位更方便”——这本身就是一个矛盾;-)你自己回答的。GUI需要处理事件以响应用户交互。您需要在另一个线程上运行干扰GUI的东西来防止这种情况。这并不难,只需将代码放入可运行的实现中,然后添加新线程(Runnable).start()即可。如果您的线程需要与GUI交互,那么您需要了解InvokeLatter()和invokeAndWait(),它们在Swing的事件调度线程上排队代码>不要这样做,学习如何使用布局(+填充和边框)。我知道如何使用布局,我只是发现绝对定位更多handy@iie:了解如何使用布局的方法是使用它们。它们确实是不可或缺的。“我知道如何使用布局,我只是觉得绝对定位更方便”——这本身就是一个矛盾;-)
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");
}
}
}