【问题标题】:KeyListener help JavaKeyListener 帮助 Java
【发布时间】:2012-09-03 23:59:41
【问题描述】:

我开始学习 Java。目前,我正在努力让一个关键的听众工作,但我很挣扎。我的代码如下。匿名内部类开头的第一个大括号有错误。我可能缺少一些简单的东西,所以任何帮助都会很有用。

public class Klistener extends JFrame {

    void Klistener()
    {
        JPanel c = new JPanel();
        c.setFocusTraversalKeysEnabled(true);
        this.add(c);
        c.addKeyListener(new KeyListener()
        {


            @Override
          public void keyTyped(KeyEvent e)
          {
              if(e.getKeyCode()==KeyEvent.VK_DOWN)
              {
                  System.out.print("hi");
              }
          }

        });
    }

    public static void main(String[] args)
    {
        Klistener a = new Klistener();
        JFrame b = new JFrame("hi");
        b.setVisible(true);
        b.setSize(500, 500);


        b.setLocation(500, 200);
        b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

  • “第一个大括号有错误……我可能遗漏了一些简单的东西” 是的。那将是堆栈跟踪或编译错误。那个,我们没有看你的显示器,或者通灵者。

标签: java swing keylistener


【解决方案1】:

您忘记为KeyListenerother two methods 提供实现。如果您不想这样做,请扩展 KeyAdapter 而不是 KeyListenerKeyAdapter 提供了 KeyListener 的所有方法的空实现,因此您可以选择要实现的方法。

【讨论】:

    【解决方案2】:

    由于KeyListenerinterface,因此您的内部类需要覆盖接口中已声明的所有方法。该接口指定了以下方法:

    public interface KeyListener extends EventListener {
    
        /**
         * Invoked when a key has been typed.
         * See the class description for {@link KeyEvent} for a definition of 
         * a key typed event.
         */
        public void keyTyped(KeyEvent e);
    
        /**
         * Invoked when a key has been pressed. 
         * See the class description for {@link KeyEvent} for a definition of 
         * a key pressed event.
         */
        public void keyPressed(KeyEvent e);
    
        /**
         * Invoked when a key has been released.
         * See the class description for {@link KeyEvent} for a definition of 
         * a key released event.
         */
        public void keyReleased(KeyEvent e);
    }
    

    更好的方法是使用KeyAdapter abstract 适配器类来接收键盘事件。在这里,您可以覆盖任何您想要的特定method,而不是全部。

    另外,由于您是Java Swing 的新手,以下链接可能会派上用场:

    哦,我注意到你在名为Klistener 的类中有一个方法void Klistener。我假设您正在尝试制作 constructor 而不是方法本身。如果是这种情况,请意识到constructors 没有任何返回类型!这是yet another link,可能会有所帮助。

    【讨论】:

    • KeyListener 有三种方法
    【解决方案3】:

    你有这么多错误,所以我什至不知道该开始:

    1) KeyListener 是一个接口,所以你必须实现所有方法。

    2) 不要将KeyListener 添加到面板,将其添加到您的JFrame。您可以通过创建匿名类或这种方式来做到这一点

    public class Klistener extends JFrame implements KeyListener{}
    

    3) 不要调用setSize() 方法,调用pack()setPreferredSize() 方法和之后的setVisible(true),并在代码末尾调用它们。

    这是您的主要方法的外观:

      public static void main(String[] args){
        Klistener k = new Klistener();
        k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        k.setLocationByPlatform(true);
        k.setPreferredSize(new Dimension(400,300));
        k.pack();
        k.setVisible(true);
    
      }
    

    【讨论】:

      【解决方案4】:

      你有一些错误。这是一个工作代码(最小更改):

      import javax.swing.*;
      import java.awt.*;
      import java.awt.event.KeyEvent;
      import java.awt.event.KeyListener;
      public class Klistener extends JFrame {
      public Klistener()
      {
          JPanel c = new JPanel();
          c.setFocusTraversalKeysEnabled(true);       
          addKeyListener(new KeyListener()
          {
      
      
              @Override
              public void keyTyped(KeyEvent e){}
      
              @Override
              public void keyPressed(KeyEvent e) {
                  if(e.getKeyCode()==KeyEvent.VK_DOWN)                
                              System.out.println("hi");
              }
      
              @Override
              public void keyReleased(KeyEvent e){}
      
          });
      
      }
      public static void main(String[] args)
      {
          Klistener a = new Klistener();
          a.setSize(500, 500);
          a.setLocation(500, 200);
          a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          a.setVisible(true);
      
      }
      }
      

      【讨论】:

      • 为什么 setVisible() 在一切之前,为什么 setSize();其他都很好。
      • 不假思索地取自原始代码...错误编辑(谢谢)
      • 因为您正在进行编辑。 1)不要扩展框架,保留对一个的引用。 2)添加一些组件(例如JTree)到框架和pack()而不是setSize() 3)调用setLoctionByPlatform(true)而不是显式设置位置。 4) 使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 5) 启动/更新 EDT 上的 GUI。 6)键绑定..
      • 为什么?我已经发布了对代码的直接修复,并且更改最少。改进代码只会使理解差异变得更加困难。
      猜你喜欢
      • 1970-01-01
      • 2010-12-20
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2012-08-10
      • 2011-08-07
      相关资源
      最近更新 更多