2017-06-25 150 views
0

我已经创建了一个jframe,并且我添加了一个按钮,点击它后,它会要求您按任何按钮,该按钮也会显示在按钮上。
(它的显示应该是这样 - >“点击我” - >“按任意按钮” - >“空格键”)
我的问题1号是,我不想从“点击我”去按空格键“按任意按钮”。
而我的第二个问题是,当我在“按任意按钮”时,按下空格键,释放时,它将返回到“按任意按钮”而不是停留在“空格键”处。
这是我的代码。如何停止空格键触发按钮上的点击效果?

public class Test { 

/** 
* @param args the command line arguments 
*/ 

static class starton implements ActionListener { 
    private JButton button; 
    private JFrame frame; 

    public starton(JButton button, JFrame frame) { 
     this.button = button; 
     this.frame = frame; 
    } 

    public void actionPerformed(ActionEvent e) { 
     button.setText("Press A Button"); 
     button.setSize(button.getPreferredSize()); 
     button.addKeyListener(
     new KeyListener() { 
      @Override 
      public void keyPressed(KeyEvent e){ 
       String text = null; 

        char a = e.getKeyChar(); 
        text = ""+a+""; 
        if (a == ' '){ 
         text = "Space Bar"; 
        } 

       button.setText(""+text+""); 
       button.setSize(button.getPreferredSize()); 
       button.removeKeyListener(this); 
      } 

      @Override 
      public void keyTyped(KeyEvent e) { 
      } 

      @Override 
      public void keyReleased(KeyEvent ke) { 
      } 
     }); 
    } 
} 

public static void main(String[] args) throws IOException { 

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    double width = screenSize.getWidth(); 
    double height = screenSize.getHeight(); 
    int frame1w = 600; 
    int frame1h = 400; 

    JFrame frame1 = new JFrame("Foo"); 
    frame1.setSize(frame1w, frame1h); 
    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel contentPane = new JPanel(); 
    contentPane.setBackground(Color.WHITE); 
    contentPane.setLayout(null); 
    frame1.setContentPane(contentPane); 

    JButton button1 = new JButton("Click Me"); 
     button1.setSize(button1.getPreferredSize()); 
     button1.addActionListener(new starton(button1, frame1)); 
      // add more code here 
     contentPane.add(button1); 
     frame1.setVisible(true); 
} 

}

回答

0

这个问题是关于因你的动作监听内KeyListener的嵌套控制。由于空格键是默认的键盘按钮,相当于单击按钮,每次点击时空格键actionPerformed按钮方法ActionListener被触发。如果您发现ActionEventactionCommand已被触发并打印出来,您可以看到发生这种情况。您也可以使用它来控制执行的代码。就像这样:

public void actionPerformed(ActionEvent e) 
{ 
    System.out.println("Button Action: " + e.getActionCommand()); 
    if(e.getActionCommand().equals("Click Me")) 
    { 
     //Your existing code but remove this line 
     //button.removeKeyListener(this); 
    } 
} 
2

JButton安装了一系列的键绑定来控制用户输入

您可以检查一下这些正在使用类似...

JButton btn = new JButton("Test"); 
InputMap im = btn.getInputMap(); 
for (KeyStroke ik : im.allKeys()) { 
    System.out.println(ik + " = " + im.get(ik)); 
} 

在我的系统,它打印

pressed SPACE = pressed 
released SPACE = released 

这告诉我,空间键绑定到操作键pressedreleased

为了禁用这些键,您需要提供自己的绑定...

Action blankAction = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
    } 
}; 

ActionMap am = btn.getActionMap(); 
am.put("pressed", blankAction); 
am.put("released", blankAction); 

这只是取代了pressedreleased绑定一个空Action它什么都不做。

现在,一个警告词 - 键绑定可以在不同的平台/外观和感觉上有所不同;您还应该注意用户通常对某些控件可以或不可以做的事情有预先定义的期望,更改它们会影响他们对您的反应程序

至于您的第二个问题,button仍在使用同样ActionListener您最初注册的,因此当你按下空间,它再次引发了ActionListener,并增加了新的KeyListener这是会加剧你的问题

要么你要使用两个按钮单独ActionListener或者你想在第一次触发时从按钮中删除ActionListener - 我会去第二次,这很容易o了解代码

不,我的意思是,如果我禁用“按”空格键,我可以按下它时,我在“按任意按钮”?

的最简单的解决方案是使用两个不同的按钮,一个与ActionListener里面设置了另一个按钮,它有一个KeyListener连接到它。

如果由于某种原因,你“真的”不想这样做,那么你就需要从按钮移除ActionListener时,它首先触发

static class starton implements ActionListener { 

    //... 

    public void actionPerformed(ActionEvent e) { 
     button.setText("Press A Button"); 
     button.setSize(button.getPreferredSize()); 
     button.addKeyListener(...); 
     button.removeActionListener(this); 
    } 
} 
+0

有关first1,我为什么要禁用“按”空格键?这不应该是整个点?我的意思是按空格键?我也没有多功能按钮,它只是1 ..也就第二个问题,我试图取消成功的动作听众,但我想能够做例行无数次,因为我想,不只是一次 –

+0

它把你的整个问题作为*“如何停止空格键触发按钮点击效果?*”和*“我不想从”点击我“去按”空格键按任意按钮“。”*作为含义,您想要禁用该按钮的[空格]栏功能。 *“我也没有多功能按钮,它只是1”* - 是的,这就是你的“核心”问题; – MadProgrammer

+0

*“我试图取消成功的动作监听,但我希望能够按照我想做的次数做多次,而不仅仅是一次”*和?再次,两个按钮将有助于解决您遇到的大部分问题。你可以简单地将它们交换到适当的位置。因为你同时在按钮上注册了一个KeyListener和一个ActionListener,所以每当你按下[Space]时,它们都会被触发,在我看来,你只是要求解决问题,通过使用两个(或更多)按钮,每个按钮都有自己的目标功能 – MadProgrammer