2016-04-24 51 views
-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; 
} 

Picture of what it looks like in both runs after pressing the start button and trying to connect to the socket, debug mode to the right.

回答

1

在审查您的问题,我编辑它,以提高其可读性。我不得不重新格式化您的代码,因为标签和空格以及不一致的缩进混合了StackOverflow代码解析器。

虽然这样做,我觉得找到了答案:在大括号从 public MainServer() {关闭和第一轮托架从start.addActionListener(new ActionListener()收盘每-其他不正确交叉。

这是你拥有的一切:

public MainServer() { 
     ... 
     start.addActionListener(new ActionListener() { 
      ...     
     } 
    }); 

这是我认为你应该有:

public MainServer() { 
     ... 
     start.addActionListener(new ActionListener() { 
      ...     
     }); 
    } 

我想吸取的教训:

  • 代码格式化非常重要 - 在尝试使代码格式保持一致时,您也会发现错误婷
  • 不是一个好主意混合制表和空格进行缩进
  • 空间,是缩进更好 - 在StackOverflow的编辑:)友好
+0

嗨感谢您的答案,这是我平生第一次使用计算器我只是把我的代码从eclipse复制/粘贴到编辑器中,然后用空格轰炸每一行。也许不是最好的选择。但是谢谢你编辑我的问题看起来好多了。对于你的回答,如果我正确理解你,你的意思是“});”应该是这样的“)};”在start.addActionListenter?或者我错误地理解了你? :) 如果我尝试我得到很多错误。你还有其他建议吗? :)谢谢 – ThePerzon

+0

我澄清了答案 –

+0

我可以看到你的意思了。在eclipse中,你建议的是我拥有的。根据你提到的观点,我发现有一对多的“}”。我编辑了出来。你有什么其他的想法可能是什么问题? – ThePerzon

相关问题