-1
我的主服務器以下循環完美的作品時,我通過它在調試模式下步驟:爲什麼java服務器的JFrame在調試模式下工作,但不是在正常執行模式下工作?
- 當啓動按鈕被按下服務器與用戶在文本框寫的插座和啓動按鈕啓動被禁用 當服務器啓動的消息
- 顯示在大的textarea表示該端口和地址上運行它
- 當客戶端連接到它會顯示一條消息,表明已建立連接
- 服務器沒有得到卡在任何其他循環,除了主要的,這是退出只有當用戶選擇退出
但是,當我在正常模式下運行程序,並按下所發生的一切開始按鈕是:
- 啓動按鈕被禁用
- 沒有消息出現
- 客戶端無法連接到指定的插座
讚賞任何幫助。
public class ServerLoop {
static boolean running;
static int currentState=0;
static int port;
static ServerSocket server = null;
public static void main (String[] args) throws IOException {
MainServer main = new MainServer();
while (true) {
currentState = main.getCurrentState();
switch (currentState) {
case 1:
port = main.getPortnumber();
JTextArea text = main.getTextArea();
String temp = text.getText();
temp = temp + "Portnumber: "+ port +"\n" +
"Server ip-address: " + main.getIpAddress()+ "\n";
main.updateText(temp);
server = new ServerSocket(port);
currentState++;
break;
case 2:
Socket clientConnection = server.accept();
text = main.getTextArea();
temp = text.getText();
temp = temp + "Connection with: " +
clientConnection.getInetAddress().getHostName() +
"established. \n";
main.updateText(temp);
new ClientConnected(clientConnection);
break;
case 3:
text = main.getTextArea();
temp = text.getText();
temp = temp + "Server shutting down...\n";
main.updateText(temp);
server.close();
text = main.getTextArea();
temp = text.getText();
temp = temp + "Server shutdown\n";
main.updateText(temp);
main.setIdle(true);
currentState=0;
break;
default:
break;
}
}
}
}
此類爲服務器創建的接口它只是一個簡單的用一個大的文本區域,一個小文本框和2個按鈕與聽衆。
如果我不得不猜測它的服務器循環和動作偵聽器在互相仇恨的按鈕上,但我不明白它爲什麼在調試模式下工作。
public class MainServer extends JFrame {
JTextArea mainTextfield;
String k = "";
JTextField portnumber;
JFrame frame;
JButton start,close;
int currentState = 0;
int porten;
boolean idle = true;
public MainServer() {
frame = new JFrame("ArenanServer v1.0");
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setSize(600, 550);
frame.setResizable(false);
frame.setBackground(Color.LIGHT_GRAY);
mainTextfield = new JTextArea();
mainTextfield.setPreferredSize(new Dimension(585,450));
mainTextfield.setBackground(Color.WHITE);
mainTextfield.setOpaque(true);
mainTextfield.setBorder(BorderFactory.createLoweredBevelBorder());
mainTextfield.setEditable(false);
JScrollPane scroll = new JScrollPane(mainTextfield)
frame.add(scroll);
JLabel port = new JLabel();
port.setText("Port: ");
frame.add(port);
portnumber = new JTextField();
portnumber.setBorder(BorderFactory.createLoweredBevelBorder());
portnumber.setPreferredSize(new Dimension(100,25));
portnumber.setDocument(new JTextFieldLimit(5));
frame.add(portnumber);
////I think this might be a problem with the actionlisteners on buttons//
start = new JButton("Start server");
close = new JButton("Close server");
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (portnumber.getText().length()>0) {
porten = Integer.parseInt(portnumber.getText());
start.setEnabled(false);
close.setEnabled(true);
currentState = 1;
idle=false;
}
else {
k = mainTextfield.getText();
k = k + "Please enter a port number.\n";
updateText(k);
}
}
});
close.setEnabled(false);
close.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
currentState = 3;
start.setEnabled(true);
close.setEnabled(false);
}
});
frame.add(start);
frame.add(close);
frame.setVisible(true);
}
這些是一些功能,用於增加主循環和它們與接口放置在相同類中的接口之間的通信。
protected JButton getStartButton() {
return start;
}
protected JButton getCloseButton() {
return close;
}
protected int getPortnumber() {
return porten;
}
protected JTextArea getTextArea() {
return mainTextfield;
}
protected JFrame getFrame() {
return frame;
}
protected boolean updateText(String l) {
mainTextfield.setText(l);
frame.repaint();
if (mainTextfield.getText().equals(l)) {
return true;
} else {
return false;
}
}
protected boolean updateview() {
frame.repaint();
return true;
}
protected int getCurrentState() {
if (idle) {
return 0;
} else {
if (currentState != 1) {
return currentState;
} else {
currentState++;
return 1;
}
}
}
protected void setIdle(boolean t) {
idle = t;
}
嗨感謝您的答案,這是我平生第一次使用計算器我只是把我的代碼從eclipse複製/粘貼到編輯器中,然後用空格轟炸每一行。也許不是最好的選擇。但是謝謝你編輯我的問題看起來好多了。對於你的回答,如果我正確理解你,你的意思是「});」應該是這樣的「)};」在start.addActionListenter?或者我錯誤地理解了你? :) 如果我嘗試我得到很多錯誤。你還有其他建議嗎? :)謝謝 – ThePerzon
我澄清了答案 –
我可以看到你的意思了。在eclipse中,你建議的是我擁有的。根據你提到的觀點,我發現有一對多的「}」。我編輯了出來。你有什麼其他的想法可能是什麼問題? – ThePerzon