JAVA类之间的双向通信

时间:2014-04-10 15:54:35

标签: java swing class parameter-passing this

我希望能够在我的GUI中创建Client类的实例,然后将GUI.this作为Client构造函数的参数传递,但我不确定如何做到这一点。我知道我错过了一些明显的东西!我希望能够从任何一个类调用另一个方法。显然我已经注释了代码,因为我不知道如何或者我应该做什么来实现这种双向通信而不需要合并类!我希望能够在GUI上单击“向上”按钮时从GUI类通过客户端发送命令等等。感谢您提前获得帮助。

客户端类:

    public class Client{
    //static playerGUI GUI;
    public static void main(String[] args) {
        //GUI = new playerGUI();
        //GUI.getFrame().setVisible(true);
        //Client cli = new Client("localhost",4444);
    }

    public Client(playerGUI GUI){   
        try{
        final Socket sock = new Socket("localhost",4444);
        final DataInputStream in = new DataInputStream(sock.getInputStream());

        final PrintStream out = new PrintStream(sock.getOutputStream());
        DataInputStream inputLine = new DataInputStream(new BufferedInputStream(System.in));

        final Thread serverResponse = new Thread(){
            public void run(){
                System.out.println("DUNGEON OF DOOM HAS STARTED");
                if(sock != null){
                    if(in != null){
                        try{
                            String response;
                            while((response = in.readLine()) != null){
                                //GUI.processgrid(response);
                                //send to GUI to process output!
                                System.out.println(response);
                            }
                        }catch(UnknownHostException uhe){
                            System.err.println("Unknown host1: " + uhe);
                        }catch(IOException ioe){
                            System.err.println("IOException1: " + ioe);
                        }catch(NullPointerException npe){
                            System.err.println("Null Pointer1: " + npe);
                        }
                    }
                }
            }
        };
        serverResponse.start();

        if(sock != null){
            if(out != null){
                try{
                    while(true){
                        //inputbuttons!
                        String sending = inputLine.readLine();
                        out.println(sending);
                        if(sending.equals("QUIT")) break;
                    }
                }catch(UnknownHostException uhe2){
                    System.err.println("Unknown host2: " + uhe2);
                }catch(IOException ioe2){
                    System.err.println("IOException2: " + ioe2);
                }catch(NullPointerException npe2){
                    System.err.println("Null Pointer2: " + npe2);
                }
            }
        }

        out.close();
        in.close();
        sock.close();
    }catch(UnknownHostException uhe3){
        System.err.println("Unknown host3: " + uhe3);
    }catch(IOException ioe3){
        System.err.println("IOException3: " + ioe3);
    }catch(NullPointerException npe3){
        System.err.println("Null Pointer3: " + npe3);
    }   
    }
}

GUI类:

public class playerGUI {
    private JFrame Frame = new JFrame();
    private JPanel displayPanel;
    private JTextPane hostTextPane;
    private JTextPane portTextPane;
    private playerGUI GUI;

    public static void main(String[] args) {

        playerGUI GUI = new playerGUI();
        GUI.Frame.setVisible(true);
        Client newclient = new Client(this.playerGUI);
    }

    /**
     * Create the application.
     */
    public playerGUI() {
        Frame.getContentPane().setBackground(new Color(255, 255, 255));
        Frame.getContentPane().setLayout(null);
        Frame.setBounds(100, 100, 500, 630);
        Frame.setUndecorated(false); // REMOVES MENU BAR
        Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // ############################################################################################################################################################################

        final JPanel humanGameWindow = new JPanel();
        humanGameWindow.setLayout(null);
        humanGameWindow.setBackground(Color.LIGHT_GRAY);
        humanGameWindow.setBounds(0, 0, 500, 600);
        humanGameWindow.setVisible(false);

        JLabel gameTitle = new JLabel("DUNGEON OF DOOM!!");
        gameTitle.setForeground(new Color(100, 149, 237));
        gameTitle.setFont(new Font("Moire", Font.BOLD, 28));
        gameTitle.setBounds(92, 5, 380, 50);

        JButton up = new JButton("Up");
        up.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ######################
            }
        });
        up.setBackground(new Color(100, 149, 237));
        up.setBounds(274, 514, 100, 40);

        JButton down = new JButton("Down");
        down.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ######################
            }
        });
        down.setBackground(new Color(100, 149, 237));
        down.setBounds(274, 555, 100, 40);

        JButton left = new JButton("Left");
        left.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ######################
            }
        });
        left.setBackground(new Color(100, 149, 237));
        left.setBounds(173, 535, 100, 40);

        JButton right = new JButton("Right");
        right.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ######################
            }
        });
        right.setBackground(new Color(100, 149, 237));
        right.setBounds(375, 535, 100, 40);

        JButton pickup = new JButton("Pickup");
        pickup.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // ######################
            }
        });
        pickup.setBackground(new Color(100, 149, 237));
        pickup.setBounds(40, 555, 100, 40);

        JButton Exit = new JButton("Exit");
        Exit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        Exit.setBackground(new Color(100, 149, 237));
        Exit.setBounds(427, 17, 70, 40);

        displayPanel = new JPanel();
        displayPanel.setBounds(48, 89, 400, 400);
        displayPanel.setLayout(new GridLayout(5, 5));
        displayPanel.setPreferredSize(new Dimension((int) (400), (int) (400)));
        for (int i = 1; i < 26; i++) {
            displayPanel.add(new JLabel("Label " + i));
        }

        humanGameWindow.add(gameTitle);
        humanGameWindow.add(up);
        humanGameWindow.add(down);
        humanGameWindow.add(left);
        humanGameWindow.add(right);
        humanGameWindow.add(pickup);
        humanGameWindow.add(Exit);
        humanGameWindow.add(displayPanel);

        final JPanel mainMenu = new JPanel();
        mainMenu.setLayout(null);
        mainMenu.setBackground(Color.LIGHT_GRAY);
        mainMenu.setBounds(0, 0, 500, 600);
        mainMenu.setVisible(true);

        JLabel mainMenuTitle = new JLabel("DUNGEON OF DOOM!!");
        mainMenuTitle.setForeground(new Color(100, 149, 237));
        mainMenuTitle.setFont(new Font("Moire", Font.BOLD, 28));
        mainMenuTitle.setBounds(50, 13, 380, 50);

        hostTextPane = new JTextPane();
        hostTextPane.setToolTipText("Enter the host name");
        hostTextPane.setBackground(new Color(192, 192, 192));
        hostTextPane.setBounds(50, 100, 234, 30);
        hostTextPane.setFont(new Font("Moire", Font.BOLD, 19));

        portTextPane = new JTextPane();
        portTextPane.setToolTipText("Enter the port");
        portTextPane.setBackground(new Color(192, 192, 192));
        portTextPane.setBounds(50, 175, 234, 30);
        portTextPane.setFont(new Font("Moire", Font.BOLD, 19));

        JButton playGameHuman = new JButton("Play Game Human");
        playGameHuman.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                mainMenu.setVisible(false);
                humanGameWindow.setVisible(true);
                                //not sure if i need to be creating the Client here?
                /*
                 * if (!(hostTextPane.getText().equals("")) &&
                 * !(portTextPane.getText().equals(""))) { try { Client cli =
                 * new Client(hostTextPane.getText(), Integer
                 * .parseInt(portTextPane.getText())); } catch (Exception e1) {
                 * System.out.println("Error."); } } else {
                 * JOptionPane.showMessageDialog(null,
                 * "Do not leave hostname or port no. blank."); }
                 */
            }
        });
        playGameHuman.setBackground(new Color(100, 149, 237));
        playGameHuman.setBounds(50, 345, 150, 55);

        mainMenu.add(mainMenuTitle);
        mainMenu.add(mainMenuQuit);
        mainMenu.add(playGameHuman);
        mainMenu.add(hostTextPane);
        mainMenu.add(portTextPane);

        getFrame().getContentPane().add(humanGameWindow);
        getFrame().getContentPane().add(mainMenu);
        getFrame().setVisible(true);

    }
}

3 个答案:

答案 0 :(得分:0)

 public static void main(String[] args) {
        playerGUI GUI = new playerGUI();
        GUI.Frame.setVisible(true);
        Client newclient = new Client(GUI);
    }

答案 1 :(得分:0)

main是一个静态方法,这意味着它在静态上下文中运行(即,不是“作为”任何实例化对象)。这意味着您无法访问this中的main,因为无法访问this。您需要使用playerGUI方法中的playerGUI.playerGUIClient.main访问playerGUI。此外,您需要将字段playerGUI.playerGUI设置为静态。

答案 2 :(得分:0)

而不是:

Client newclient = new Client(this.playerGUI);

你需要这个:

Client newclient = new Client(GUI);

请注意,由于main是静态的,因此未定义this

还要考虑更改类和变量的名称以遵循Java命名约定:

  • playerGUI应为PlayerGUI
  • GUI应为gui或您想要的任何内容,但以小写字母
  • 开头

您是否还注意到您没有使用名为GUI的字段?您只使用变量GUI。所以它可能会造成混乱。