Java 键绑定在JForm中不起作用

Java 键绑定在JForm中不起作用,java,swing,jframe,key-bindings,Java,Swing,Jframe,Key Bindings,我的jFormUI中有左键和右键,我想将“A”和“d”绑定到这些按钮上。我一直在关注其他关于这方面的帖子,但我似乎仍然无法让它发挥作用 以下是我的按钮代码: private void clickRightActionPerformed(java.awt.event.ActionEvent evt) { this.evt = evt; try { lastScore = cellD

我的jFormUI中有左键和右键,我想将“A”和“d”绑定到这些按钮上。我一直在关注其他关于这方面的帖子,但我似乎仍然无法让它发挥作用

以下是我的按钮代码:

private void clickRightActionPerformed(java.awt.event.ActionEvent evt) {                                           
    this.evt = evt;
    try {
        lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
        nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
        System.out.println();
        scoreSet(xls, sheetNum, rowNum - 2, "n", lastScore);
    } catch (Exception ex) {
        Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
    giveScore.setText("SCORE = " + nextScore);
}   

private void clickLeftActionPerformed(java.awt.event.ActionEvent evt) {                                          
    SetImageSize(rowNum, reviewImages, pic);
    try {
        if (rowNum < imageCount - 1) {
            lastScore = cellData(sheetNum, rowNum + 2, xls.getAbsolutePath());
            nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
        scoreSet(xls, sheetNum, rowNum, "p", lastScore);
        } else {
            lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
            nextScore = cellData(sheetNum, 1, xls.getAbsolutePath());
        }
    } catch (Exception ex) {
        Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
    giveScore.setText("SCORE = " + nextScore);
}     

您在阅读之前有很多阅读,我建议您从以下内容开始:

您要做的第一件事是解耦功能。这意味着“向左移动”和“向右移动”操作独立于调用它们的方式,对我来说,这是从一个
接口开始的,该接口描述了提供的基本契约

public interface MovementController {
    public void moveRight();
    public void moveLeft();
}
(是的,如果是我,我会有一个左右的
界面,但我尽量保持简单;)

接下来,您要设计一些
操作
s,它们可以与这个
界面

public class RightAction extends AbstractAction {

    private Controller controller;

    public RightAction(Controller controller) {
        this.controller = controller;
        // Button text
        putValue(NAME, "Right");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        controller.moveRight();
    }

}

public class LeftAction extends AbstractAction {

    private Controller controller;

    public LeftAction(Controller controller) {
        this.controller = controller;
        // Button text
        putValue(NAME, "Left");
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        controller.moveLeft();
    }

}
最后,我们需要对它进行全面调查

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Test extends JPanel implements Controller {

    public Test() {
        LeftAction leftAction = new LeftAction(this);
        RightAction rightAction = new RightAction(this);

        JButton leftButton = new JButton(leftAction);
        JButton rightButton = new JButton(rightAction);

        // Add buttons to the UI...

        InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "left");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "right");

        am.put("left", leftAction);
        am.put("right", rightAction);
    }

    @Override
    public void moveRight() {
        try {
            lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
            nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
            System.out.println();
            scoreSet(xls, sheetNum, rowNum - 2, "n", lastScore);
        } catch (Exception ex) {
            Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
        giveScore.setText("SCORE = " + nextScore);
    }

    @Override
    public void moveLeft() {
        SetImageSize(rowNum, reviewImages, pic);
        try {
            if (rowNum < imageCount - 1) {
                lastScore = cellData(sheetNum, rowNum + 2, xls.getAbsolutePath());
                nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
                scoreSet(xls, sheetNum, rowNum, "p", lastScore);
            } else {
                lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
                nextScore = cellData(sheetNum, 1, xls.getAbsolutePath());
            }
        } catch (Exception ex) {
            Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
        giveScore.setText("SCORE = " + nextScore);
    }

}
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.AbstractAction;
导入javax.swing.ActionMap;
导入javax.swing.InputMap;
导入javax.swing.JButton;
导入javax.swing.JPanel;
导入javax.swing.KeyStroke;
公共类测试扩展了JPanel实现的控制器{
公开考试(){
LeftAction LeftAction=新的LeftAction(此);
RightAction RightAction=新RightAction(本);
JButton leftButton=新JButton(leftAction);
JButton rightButton=新JButton(rightAction);
//将按钮添加到UI。。。
InputMap im=getInputMap(在聚焦窗口中时);
ActionMap am=getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A,0),“left”);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D,0),“right”);
am.put(“左”,左动作);
am.put(“正确”,正确行动);
}
@凌驾
公权{
试一试{
lastScore=cellData(sheetNum,rowNum,xls.getAbsolutePath());
nextScore=cellData(sheetNum,rowNum+1,xls.getAbsolutePath());
System.out.println();
分数集(xls,sheetNum,rowNum-2,“n”,lastScore);
}捕获(例外情况除外){
Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE,null,ex);
}
giveScore.setText(“SCORE=“+nextScore”);
}
@凌驾
公共空间左移(){
SetImageSize(rowNum,reviewImage,pic);
试一试{
if(rowNum
作为一个常见的建议,最好将您的UI基于
JPanel
而不是
JFrame
JFrame
是一个复合组件,这只会增加其全面管理的复杂性,从一个
JPanel
开始,作为基础组件,您可以更自由地将它添加到以后想要的容器中

它看起来不像一个,它看起来像一个
keysister
,这就解释了您的核心问题。另外,
ClickRightActionExecuted(evt)
无法编译,该方法的形式参数需要一个
ActionEvent
的实例,但您正试图传递一个
KeyListener
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Test extends JPanel implements Controller {

    public Test() {
        LeftAction leftAction = new LeftAction(this);
        RightAction rightAction = new RightAction(this);

        JButton leftButton = new JButton(leftAction);
        JButton rightButton = new JButton(rightAction);

        // Add buttons to the UI...

        InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "left");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0), "right");

        am.put("left", leftAction);
        am.put("right", rightAction);
    }

    @Override
    public void moveRight() {
        try {
            lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
            nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
            System.out.println();
            scoreSet(xls, sheetNum, rowNum - 2, "n", lastScore);
        } catch (Exception ex) {
            Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
        giveScore.setText("SCORE = " + nextScore);
    }

    @Override
    public void moveLeft() {
        SetImageSize(rowNum, reviewImages, pic);
        try {
            if (rowNum < imageCount - 1) {
                lastScore = cellData(sheetNum, rowNum + 2, xls.getAbsolutePath());
                nextScore = cellData(sheetNum, rowNum + 1, xls.getAbsolutePath());
                scoreSet(xls, sheetNum, rowNum, "p", lastScore);
            } else {
                lastScore = cellData(sheetNum, rowNum, xls.getAbsolutePath());
                nextScore = cellData(sheetNum, 1, xls.getAbsolutePath());
            }
        } catch (Exception ex) {
            Logger.getLogger(ReviewingWindow.class.getName()).log(Level.SEVERE, null, ex);
        }
        giveScore.setText("SCORE = " + nextScore);
    }

}