2016-11-29 2 views
1

, поэтому я использовал WindowBuilder для затмения для разработки моего графического интерфейса. После этого я попытался проверить его, чтобы увидеть, правильно ли отображается графический интерфейс, но по какой-то причине приложение закрывается почти сразу после его запуска.Приложение закрывается сразу после открытия

Вот мой код:

public class ServerFrame extends JFrame { 

private JTextField ServerAddressField; 
private JTextField PortNumberField; 
private server ChatServer; 
private InetAddress ServerAddress ; 
private JTextArea ChatBox; 
private JTextArea ClientTextArea; 
private JTextArea UserText; 
private JButton Start, Send; 

/** 
* Create the application. 
*/ 

/** 
* Initialize the contents of the frame. 
*/ 
public ServerFrame() { 

    setTitle("Server"); 
    setSize(700,700); 
    Container cp = getContentPane();  
    cp.setLayout(new FlowLayout()); 
    cp.setVisible(true); 

    ChatBox = new JTextArea(); 
    ChatBox.setBounds(20, 30, 497, 259); 
    cp.add(ChatBox); 

    ClientTextArea = new JTextArea(); 
    ClientTextArea.setBounds(549, 30, 128, 259); 
    cp.add(ClientTextArea); 

    UserText = new JTextArea(); 
    UserText.setBounds(20, 317, 497, 57); 
    cp.add(UserText); 

    ServerAddressField = new JTextField(); 
    ServerAddressField.setBounds(107, 414, 130, 26); 
    cp.add(ServerAddressField); 
    ServerAddressField.setColumns(10); 

    JLabel lblNewLabel = new JLabel("Server Address:"); 
    lblNewLabel.setBounds(6, 417, 110, 21); 
    cp.add(lblNewLabel); 

    PortNumberField = new JTextField(); 
    PortNumberField.setBounds(342, 414, 130, 26); 
    cp.add(PortNumberField); 
    PortNumberField.setColumns(10); 

    JLabel lblPortNumber = new JLabel("Port Number:"); 
    lblPortNumber.setBounds(249, 417, 116, 21); 
    cp.add(lblPortNumber); 

    Start = new JButton("Connect"); 
    Start.setBounds(482, 414, 117, 29); 
    cp.add(Start); 

    Send = new JButton("Send"); 
    Send.setBounds(529, 332, 117, 29); 
    cp.add(Send); 

    JLabel lblChatHistory = new JLabel("Chat History"); 
    lblChatHistory.setBounds(231, 6, 92, 16); 
    cp.add(lblChatHistory); 

    JLabel lblClientList = new JLabel("Client List"); 
    lblClientList.setBounds(579, 8, 75, 12); 
    cp.add(lblClientList); 


    Start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      ChatServer=new server(); 
      ChatServer.start(); 

     } 
    }); 
    Send.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // ChatServer.SendMassage(ServerAddress.getHostName()+" <Server> "+UserText.getText()); 
      UserText.setText(""); 

     } 
    }); 

    UserText.addKeyListener(new KeyListener(){ 

     @Override 
     public void keyTyped(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
       e.consume(); 
       Send.doClick();   
     } 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub 

     } 

    }); 


} 

public static void main(String[] args) { 
    // TODO code application logic here 
    new ServerFrame(); 
} 

Любая помощь будет оценена. Большое спасибо!

ответ

2

Вы никогда не звоните setVisible(true) в верхнем уровне окна, ServerFrame.this JFrame, и поэтому поток событий никогда не запускается.

После добавления всех ваших компонентов в ServerFrame просто наберите setVisible(true). ..... или в основной метод, сделайте следующее:

new ServerFrame().setVisible(true); 

Другой вопрос: В то время как пустые макеты и setBounds() может показаться Качели новичками, как самый простой и лучший способ для создания комплекса графического интерфейса, тем больше Качели GUI'S вы создаете тем более серьезные трудности вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного ,

Также не забудьте запустить свой графический интерфейс в потоке событий Swing, в противном случае вы рискуете столкнуться с некоторыми ошибками потоковой обработки и отладить их. например,

public static void main(String[] args) { 
    SwingUtilities.invokeLater(() -> { 
     new ServerFrame().setVisible(true); 
    }); 
} 
+0

EDITED: извините, когда я обновил страницу, я увидел только первый абзац в вашем ответе. Теперь я исправлю свой код с вашими предложениями и посмотрю, поможет ли он решить проблему. – Calvin

+0

Пожалуйста, посмотрите мой отредактированный комментарий, это была ошибка с моей стороны, извините! – Calvin

+1

@Calvin: Хорошо, пожалуйста, верните меня на это. Также вы используете FlowLayout, макет, который не учитывает «границы» компонента. Опять же, я призываю вас узнать и использовать менеджеров макетов. Это сделает ваш код намного легче отлаживать. –