应用程序不显示GUI,也不会退出Java

时间:2014-04-29 15:24:44

标签: java

所以我用Java创建了一个游戏,我遇到了一个小问题。每当我运行应用程序时,GUI都不会显示在屏幕上,关闭应用程序的唯一方法是使用Windows任务管理器。在应用程序中,您选择一个用户名并单击一个输入按钮,该按钮将创建一个播放游戏的新窗口。但是在单击按钮后,没有任何GUI加载,您无法关闭应用程序。

基本上,当您单击按钮时,会调用一个方法来处理当前窗口并启动游戏窗口。该方法的代码如下:

public void login(String name) {
    String[] args={};
    dispose();
    SingleplayerGUI.main(args);
}

这是SingleplayerGUI类的代码:

public SingleplayerGUI(String userName, Singleplayer sp) {
    this.userName = userName;
    setResizable(false);
    setTitle("Console Clash Singleplayer");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(880, 550);
    setLocationRelativeTo(null);

    System.setIn(inPipe); 
    try {
        System.setOut(new PrintStream(new PipedOutputStream(outPipe), true));
        inWriter = new PrintWriter(new PipedOutputStream(inPipe), true); 
    } catch (IOException e1) {
        e1.printStackTrace();
    } 

    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);

    GridBagLayout gbl_contentPane = new GridBagLayout();
    gbl_contentPane.columnWidths = new int[] { 28, 815, 30, 7 }; // SUM = 880
    gbl_contentPane.rowHeights = new int[] { 25, 485, 40 }; // SUM = 550
    contentPane.setLayout(gbl_contentPane);

    history = new JTextPane();
    history.setEditable(false);
    JScrollPane scroll = new JScrollPane(history);
    caret = (DefaultCaret) history.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    GridBagConstraints scrollConstraints = new GridBagConstraints();
    scrollConstraints.insets = new Insets(0, 0, 5, 5);
    scrollConstraints.fill = GridBagConstraints.BOTH;
    scrollConstraints.gridx = 0;
    scrollConstraints.gridy = 0;
    scrollConstraints.gridwidth = 2;
    scrollConstraints.gridheight = 2;
    scrollConstraints.weightx = 1;
    scrollConstraints.weighty = 1;
    scrollConstraints.insets = new Insets(0, 0, 5, -64);
    contentPane.add(scroll, scrollConstraints);

    txtMessage = new JTextField();
    txtMessage.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                Color color = new Color(92, 219, 86);
                String text = txtMessage.getText();
                inWriter.println(text); 
                console(txtMessage.getText(), color);
                command = txtMessage.getText();
            }
        }
    });
    GridBagConstraints gbc_txtMessage = new GridBagConstraints();
    gbc_txtMessage.insets = new Insets(0, 0, 0, 25);
    gbc_txtMessage.fill = GridBagConstraints.HORIZONTAL;
    gbc_txtMessage.gridx = 0;
    gbc_txtMessage.gridy = 2;
    gbc_txtMessage.gridwidth = 2;
    gbc_txtMessage.weightx = 1;
    gbc_txtMessage.weighty = 0;
    txtMessage.setColumns(5);
    contentPane.add(txtMessage, gbc_txtMessage);

    chat = new JTextPane();
    chat.setEditable(false);
    JScrollPane chatscroll = new JScrollPane(chat);
    caret = (DefaultCaret) chat.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
    GridBagConstraints chatscrollConstraints = new GridBagConstraints();
    chatscrollConstraints.insets = new Insets(0, 0, 5, 5);
    chatscrollConstraints.fill = GridBagConstraints.BOTH;
    chatscrollConstraints.gridx = 0;
    chatscrollConstraints.gridy = 0;
    chatscrollConstraints.gridwidth = 2;
    chatscrollConstraints.gridheight = 2;
    chatscrollConstraints.weightx = 1;
    chatscrollConstraints.weighty = 1;
    chatscrollConstraints.insets = new Insets(150, 600, 5, -330);
    contentPane.add(chatscroll, chatscrollConstraints);

    chatMessage = new JTextField();
    final String name = this.userName;
    chatMessage.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                chatconsole(name + ": " + chatMessage.getText());
            }
        }
    });
    GridBagConstraints gbc_chatMessage = new GridBagConstraints();
    gbc_txtMessage.insets = new Insets(000, 600, 000, -330);
    gbc_txtMessage.fill = GridBagConstraints.HORIZONTAL;
    gbc_txtMessage.gridx = 0;
    gbc_txtMessage.gridy = 2;
    gbc_txtMessage.gridwidth = 2;
    gbc_txtMessage.weightx = 1;
    gbc_txtMessage.weighty = 0;
    txtMessage.setColumns(5);
    contentPane.add(chatMessage, gbc_txtMessage);

    JButton btnSend = new JButton("Send");
    btnSend.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Color color = new Color(92, 219, 86);
            String text = txtMessage.getText();
            inWriter.println(text); 
            console(txtMessage.getText(), color);
            command = txtMessage.getText();
        }
    });
    GridBagConstraints gbc_btnSend = new GridBagConstraints();
    gbc_btnSend.insets = new Insets(0, 0, 0, 275);
    gbc_btnSend.gridx = 2;
    gbc_btnSend.gridy = 2;
    gbc_btnSend.weightx = 0;
    gbc_btnSend.weighty = 0;
    contentPane.add(btnSend, gbc_btnSend);

    list = new JList();
    GridBagConstraints gbc_list = new GridBagConstraints();
    gbc_list.insets = new Insets(0, 600, 330, -330);
    gbc_list.fill = GridBagConstraints.BOTH;
    gbc_list.gridx = 0;
    gbc_list.gridy = 0;
    gbc_list.gridwidth = 2;
    gbc_list.gridheight = 2;
    JScrollPane p = new JScrollPane();
    p.setViewportView(list);
    contentPane.add(p, gbc_list);
    list.setFont(new Font("Verdana", 0, 24));

    System.out.println("HEY");

    setVisible(true);

    new SwingWorker<Void, String>() { 
         protected Void doInBackground() throws Exception { 
            Scanner s = new Scanner(outPipe);
            while (s.hasNextLine()) {
                     String line = s.nextLine();
                     publish(line);
            }
            return null; 
        } 
         @Override protected void process(java.util.List<String> chunks) { 
             for (String line : chunks) {
                try {
                    Document doc = history.getDocument();
                    doc.insertString(doc.getLength(), line + "\r\n", null);
                } catch(BadLocationException exc) {
                    exc.printStackTrace();
                }
             }
         } 

    }.execute(); 

    Singleplayer spp = new Singleplayer();
    Singleplayer.startOfGame();

    setVisible(true);
}

public static void console(String message, Color color) {
    txtMessage.setText("");
    try {
        StyledDocument doc = history.getStyledDocument();
        Style style = history.addStyle("", null);
        StyleConstants.setForeground(style, color);
        doc.insertString(doc.getLength(), message + "\r\n", style);
    } catch(BadLocationException exc) {
        exc.printStackTrace();
    }
}

public static void console(String message) {
    txtMessage.setText("");
    try {
        Document doc = history.getDocument();
        doc.insertString(doc.getLength(), message + "\r\n", null);
    } catch(BadLocationException exc) {
        exc.printStackTrace();
    }
}

public void chatconsole(String message) {
    chatMessage.setText("");
    try {
          Document doc = chat.getDocument();
          doc.insertString(doc.getLength(), message + "\r\n", null);
       } catch(BadLocationException exc) {
          exc.printStackTrace();
       }
}

public static void single() {
    Singleplayer sp = new Singleplayer();
    new SingleplayerGUI("", sp);
}

public static void main(String[] args) {
    Singleplayer sp = new Singleplayer();
    new SingleplayerGUI("", sp);
}

单人游戏课程:

public static void startOfGame(){
    System.out.println("HEY");
    SingleplayerGUI.console("Welcome to Console Clash Pre Alpha Version 1!");
    SingleplayerGUI.console("Created by Drift");
    SingleplayerGUI.console("Published by Boring Games");
    SingleplayerGUI.console("");
    SingleplayerGUI.console("");
    menuScreen();
}

static void menuScreen() {
    Scanner scan = new Scanner(System.in);
    System.out.println("To play the game, type 'start'.  To quit, type 'quit'.");
        String menu = scan.nextLine();
        if (menu.equals("start")) {
            start();
        } else if (menu.equals("quit")) {
            quit();
        } else {
            menuScreen();
        }
}

private static void quit() {
    SingleplayerGUI.console("You quit the game.");
}

private static void start() {
    SingleplayerGUI.console("You started the game.");
}

到目前为止,我已经发现将outPipe添加到控制台时会出现最常见的问题。我能解决这个问题,还是我不能在这个应用程序中使用outPipes?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

调用setVisible()方法两次。在Singleplayer.startOfGame()之后删除第二个setVisible()调用; SingleplayerGUI构造函数中的行。