Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确的按键方式_Java_Swing_Key Bindings_Keylistener - Fatal编程技术网

Java 正确的按键方式

Java 正确的按键方式,java,swing,key-bindings,keylistener,Java,Swing,Key Bindings,Keylistener,在Java中处理按键的最佳方法是什么?我曾试图设置我的KeyListener代码,但后来我发现在线键绑定是应该使用的,但在阅读之后 由于无法在网上找到任何教程,我更加困惑 以下是我一直在尝试的: frame = new JFrame("Jay's Game Title"); Container panel = (JPanel)frame.getContentPane(); ... panel.setFocusable(true); panel.requestFocus(); panel.add

在Java中处理按键的最佳方法是什么?我曾试图设置我的KeyListener代码,但后来我发现在线键绑定是应该使用的,但在阅读之后

由于无法在网上找到任何教程,我更加困惑

以下是我一直在尝试的:

frame = new JFrame("Jay's Game Title");
Container panel = (JPanel)frame.getContentPane();
...
panel.setFocusable(true);
panel.requestFocus();
panel.addKeyListener(this);//TODO:fix me please, this is not working
frame.setSize(1024, 768);
frame.setVisible(true);
frame.setFocusable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
但是没有用。任何帮助都是非常感谢的,在此期间,我将继续查看其他人的帖子,并拔出更多的头发

注意:我的按钮代码工作得非常好,我希望在另一个keypresss.java文件或其他文件中处理我的按键,以保持它的组织性

package com.jayavon.game.client;
/****************************************************************
 *  Author      :   ***REMOVED***
 *  Start Date  :   09/04/2011
 *  Last Update :   10/04/2011
 *  
 *  Description
 *  This is the video game application
 *  This application is used to sending and receiving the messages
 *  and all of the game data(soon, hopefully :p).
 *  
 *  Remarks
 *  Before running the client application make sure the server is 
 *  running.
 ******************************************************************/
import javax.swing.*;

import java.awt.Container;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Iterator;

public class MyClient extends JFrame implements ActionListener, KeyListener{
    JFrame frame;
    JTextField chatBoxTxt;
    JButton sendButton, exitButton, onlineButton, backpackButton, characterButton, helpButton, optionsButton, questsButton, skillsButton;
    JInternalFrame skillsFrame, onlineFrame;
    DefaultListModel modelChatList;
    JList listForChat;
    JScrollPane chatScrollPane;
    DefaultListModel modelUserList;
    JList listForUsers;
    JScrollPane userListScrollPane;
    String name, password;
    Socket s, s1, s2;
    DataInputStream messageIn;
    DataOutputStream messageOut;
    DataInputStream userNameIn;
    DataOutputStream userNameOut;
    DataOutputStream userLogOut;

    MyClient(String name, String password) throws IOException{
        this.name = name;
        initGUI();
        s = new Socket("localhost",1004);   //creates a socket object
        s1 = new Socket("localhost",1004);
        s2 = new Socket("localhost",1004);
        //create input-stream for a particular socket
        messageIn = new DataInputStream(s.getInputStream());
        //create output-stream
        messageOut = new DataOutputStream(s.getOutputStream());
        //sending a message for login
        messageOut.writeUTF(name + " has joined the game.");    
        userLogOut = new DataOutputStream(s1.getOutputStream());
        userNameOut = new DataOutputStream(s2.getOutputStream());
        userNameIn = new DataInputStream(s2.getInputStream());
        //creating a thread for maintaining the list of user name
        MyUserNameReciever userNameReciever = new MyUserNameReciever(userNameOut, modelUserList, name, userNameIn);
        Thread userNameRecieverThread = new Thread(userNameReciever);
        userNameRecieverThread.start();         
        //creating a thread for receiving a messages
        MyMessageReciever messageReciever = new MyMessageReciever(messageIn, modelChatList);
        Thread messageRecieverThread = new Thread(messageReciever);
        messageRecieverThread.start();
    }

    public void initGUI(){
        frame = new JFrame("Jay's Game Title");
        Container panel = (JPanel)frame.getContentPane();
        chatBoxTxt = new JTextField();
        panel.add(chatBoxTxt);
        chatBoxTxt.setBounds(5,605,650,30);
        chatBoxTxt.setVisible(false);
        sendButton = new JButton("Send");
        sendButton.addActionListener(this);
        panel.add(sendButton);
        sendButton.setBounds(260,180,90,30);
        modelChatList = new DefaultListModel();
        listForChat = new JList(modelChatList);
        chatScrollPane = new JScrollPane(listForChat);
        panel.add(chatScrollPane);
        chatScrollPane.setBounds(5,640,650,80);
        modelUserList = new DefaultListModel();
        listForUsers = new JList(modelUserList);
        userListScrollPane = new JScrollPane(listForUsers);
        userListScrollPane.setSize(100,250);
        userListScrollPane.setVisible(false);  

        backpackButton = new JButton(new ImageIcon("images/gui/button_backpack.png"));
        backpackButton.addActionListener(this);
        backpackButton.setBounds(660,686,33,33);
        backpackButton.setBorderPainted(false);backpackButton.setFocusPainted(false);
        backpackButton.setToolTipText("Backpack[B]");
        panel.add(backpackButton);
        characterButton = new JButton(new ImageIcon("images/gui/button_character.png"));
        characterButton.addActionListener(this);
        characterButton.setBounds(695,686,33,33);
        characterButton.setBorderPainted(false);characterButton.setFocusPainted(false);
        characterButton.setToolTipText("Character[C]");
        panel.add(characterButton);
        skillsButton = new JButton(new ImageIcon("images/gui/button_skills.png"));
        skillsButton.addActionListener(this);
        skillsButton.setBounds(730,686,33,33);
        skillsButton.setBorderPainted(false);skillsButton.setFocusPainted(false);
        skillsButton.setToolTipText("Skills[V]");
        panel.add(skillsButton);
        questsButton = new JButton(new ImageIcon("images/gui/button_quests.png"));
        questsButton.addActionListener(this);
        questsButton.setBounds(765,686,33,33);
        questsButton.setBorderPainted(false);questsButton.setFocusPainted(false);
        questsButton.setToolTipText("Quests[N]");
        panel.add(questsButton);
        onlineButton = new JButton(new ImageIcon("images/gui/button_online.png"));
        onlineButton.addActionListener(this);
        onlineButton.setBounds(800,686,33,33);
        onlineButton.setBorderPainted(false);onlineButton.setFocusPainted(false);
        onlineButton.setToolTipText("Online List[U]");
        panel.add(onlineButton);
        helpButton = new JButton(new ImageIcon("images/gui/button_help.png"));
        helpButton.addActionListener(this);
        helpButton.setBounds(835,686,33,33);
        helpButton.setBorderPainted(false);helpButton.setFocusPainted(false);
        helpButton.setToolTipText("Help[I]");
        panel.add(helpButton);
        optionsButton = new JButton(new ImageIcon("images/gui/button_options.png"));
        optionsButton.addActionListener(this);
        optionsButton.setBounds(870,686,33,33);
        optionsButton.setBorderPainted(false);optionsButton.setFocusPainted(false);
        optionsButton.setToolTipText("Options[O]");
        panel.add(optionsButton);
        exitButton = new JButton(new ImageIcon("images/gui/button_exit.png"));
        exitButton.addActionListener(this);
        exitButton.setBounds(905,686,33,33);
        exitButton.setBorderPainted(false);exitButton.setFocusPainted(false);
        exitButton.setToolTipText("Exit[none]");
        panel.add(exitButton);

        skillsFrame = new JInternalFrame("Skills", true, true, false, false);
        skillsFrame.setBounds(600, 10, 400, 500);
        skillsFrame.setVisible(false);
        panel.add(skillsFrame);
        onlineFrame = new JInternalFrame("Users", true, true, false, false);
        onlineFrame.setContentPane(userListScrollPane);
        onlineFrame.setBounds(850, 10, 150, 300);
        onlineFrame.setVisible(false);
        panel.add(onlineFrame);

        panel.setLayout(null);
        panel.setFocusable(true);
        panel.requestFocus();
        panel.addKeyListener(this);//TODO:fix me please, this is not working

        frame.setSize(1024, 768);
        frame.setVisible(true);
        frame.setFocusable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e){
        // sending the messages
        if(e.getSource() == sendButton && chatBoxTxt.isVisible() == false){ 
            chatBoxTxt.setVisible(true);
            chatBoxTxt.requestFocus(true);
        } else if (e.getSource() == sendButton && chatBoxTxt.isVisible() == true){
            String str = "";
            str = chatBoxTxt.getText();
            if (str != ""){
                str = name + ": > " + str;
                try{
                    messageOut.writeUTF(str);
                    System.out.println(str);
                    messageOut.flush();
                }catch(IOException ae)
                {System.out.println(ae);}
            }
            //and hide chatBoxTxt
            chatBoxTxt.setText("");
            chatBoxTxt.setVisible(false);
        }
        // show user list
        if (e.getSource() == onlineButton){
            if (userListScrollPane.isVisible()){
                userListScrollPane.setVisible(false);
            } else {
                userListScrollPane.setVisible(true);
            }
            if (onlineFrame.isVisible()){
                onlineFrame.setVisible(false);
            } else {
                onlineFrame.setVisible(true);
            }
        }
        // show skill list
        if (e.getSource() == skillsButton){
            if (skillsFrame.isVisible()){
                skillsFrame.setVisible(false);
            } else {
                skillsFrame.setVisible(true);
            }
        }
        // client logout
        if (e.getSource() == exitButton){
            int exit = JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?");
            if (exit == JOptionPane.YES_OPTION){
                frame.dispose();
                try{
                    //sending the message for logout
                    messageOut.writeUTF(name + " has logged out.");
                    userLogOut.writeUTF(name);
                    userLogOut.flush();
                    Thread.currentThread().sleep(1000);
                    System.exit(1);
                }catch(Exception oe){}
            }
        }
    }

    public void windowClosing(WindowEvent w){
        try{
            userLogOut.writeUTF(name + " has logged out.");
            userLogOut.flush(); 
            Thread.currentThread().sleep(1000);
            System.exit(1);
        }catch(Exception oe){}
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int id = e.getID();
        //open up chatBoxTxt for typing
        if (id == KeyEvent.VK_ENTER && !chatBoxTxt.isVisible()){
            chatBoxTxt.setVisible(true);
            chatBoxTxt.requestFocus(true);
        } //it is open so want to send text
        else if (id == KeyEvent.VK_ENTER && chatBoxTxt.isVisible()) {
            //send message
            String str = "";
            str = chatBoxTxt.getText();
            //make sure there is a message
            if (str.length() > 0){
                chatBoxTxt.setText("");
                str = name + ": > " + str;
                try{
                    messageOut.writeUTF(str);
                    System.out.println(str);
                    messageOut.flush();
                }catch(IOException ae)
                {System.out.println(ae);}
            }
            //and hide chatBoxTxt
            chatBoxTxt.setVisible(false);       
        } //press (Map) key without chatBoxTxt being open
        else if (id == KeyEvent.VK_M && !chatBoxTxt.isVisible()){

        } //press (Character) key without chatBoxTxt being open
        else if (id == KeyEvent.VK_C && !chatBoxTxt.isVisible()){

        } //press (Backpack) key without chatBoxTxt being open
        else if (id == KeyEvent.VK_B && !chatBoxTxt.isVisible()){

        }
    }   

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

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

    // class is used to maintain the list of user name
    class MyUserNameReciever implements Runnable{
        DataOutputStream userNameOut;
        DefaultListModel modelUserList; 
        DataInputStream userNameIn;
        String name, lname;
        ArrayList alname = new ArrayList(); //stores the list of user names
        ObjectInputStream obj; // read the list of user names
        int i = 0;
        MyUserNameReciever(DataOutputStream userNameOut, DefaultListModel modelUserList, String name, DataInputStream userNameIn){
            this.userNameOut = userNameOut;
            this.modelUserList = modelUserList;
            this.name = name;
            this.userNameIn = userNameIn;
        }
        public void run(){
            try{
                userNameOut.writeUTF(name);  // write the user name in output stream
                while(true){
                    obj = new ObjectInputStream(userNameIn);
                    //read the list of user names
                    alname = (ArrayList)obj.readObject(); 
                    if(i>0)
                        modelUserList.clear(); 
                    Iterator i1 = alname.iterator();
                    System.out.println(alname);
                    while(i1.hasNext()){
                        lname = (String)i1.next();
                        i++;
                        //add the user names in list box
                        modelUserList.addElement(lname);
                    }
                }
            }catch(Exception oe){}
        }
    }

    //class is used to received the messages
    class MyMessageReciever implements Runnable{
        DataInputStream messageIn;
        DefaultListModel modelChatList;
        MyMessageReciever(DataInputStream messageIn, DefaultListModel modelChatList){
            this.messageIn = messageIn;
            this.modelChatList = modelChatList;
        }
        public void run(){
            String incommingMessage = "";
            while(true){
                try{
                    incommingMessage = messageIn.readUTF(); // receive the message from server
                    // add the message in list box
                    modelChatList.addElement(incommingMessage);
                    /* forces chat to bottom of screen :TODO but doesn't allow scrolling up
                chatScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
                    public void adjustmentValueChanged(AdjustmentEvent e) {
                        e.getAdjustable().setValue(e.getAdjustable().getMaximum());
                    }});*/
                }catch(Exception e){}
            }
        }
    }

}
由于无法在网上找到任何教程,我更加困惑

该链接是一个教程。除非你问一个特定的问题,否则我们不知道你不懂什么

我的按钮代码非常好用

看起来您希望Enter键执行与单击按钮相同的处理。在本例中,简单的解决方案是向文本字段添加ActionListener,而不是使用键绑定。对此,你甚至不应该考虑使用KeyListener。

当然,这意味着您需要重新设计程序,为每个按钮使用不同的ActionListener。所以你需要“发送”、“在线”、“技能”和“退出”ActionListeners。然后发送按钮和文本字段都可以使用“发送”ActionListener

编辑:

例如:用户可以点击(VK_V)或单击技能按钮来显示技能内部框架

您将为此使用密钥绑定。您可以按照教程中的说明手动执行绑定

或者,更简单的解决方案是使用带有菜单项的JMenu来调用您的操作。然后,您可以为菜单项设置加速器。有关更多信息,请阅读上的Swing教程部分


任何进一步的帮助都需要你发布你的SSCCE,

你为什么不添加监听器自己做
JFrame
呢?哇!超过300行代码,仍然忽略2/3的异常。请考虑准备和张贴一张(并打印每个捕获的堆栈跟踪)。另外,请复制/粘贴stacktrace本身。我的目标是拥有一个按钮和一个快捷键,例如:用户可以点击(VK_V)或单击技能按钮以显示技能内部框架。对于按钮,代码非常简单:if(e.getSource()==skillsButton){if(skillsFrame.isVisible()){skillsFrame.setVisible(false);}else{skillsFrame.setVisible(true);}所以每个按钮都会有一个匹配的我想要触发的键盘快捷键(相同的代码)无论你在游戏中专注于什么,为什么不使用按键绑定呢?感谢大家的帮助,非常感谢。我仍然没有让它工作,但不是因为缺乏尝试。我会继续插入。我的按钮位于框架底部(我不想要菜单)。如果我不将菜单添加到框架中,我还可以使用带有加速器的菜单吗?或者对我来说更好的方法是使用它,但它不需要Alt键…这是可能的吗?skillsButton.setMnemonic(KeyEvent.VK_V);好的,是的,我不想承认这一点,但我只是在多年的课程后对编码很糟糕。出于某种原因,我只是不理解Sun的键绑定链接。完全是我的错,我很尴尬,我会检查你的链接,我感谢你的时间。我将努力从我的java文件制作一个SSCCE,希望有所收获。谢谢!