首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyBinding在JForm中不起作用

KeyBinding在JForm中不起作用
EN

Stack Overflow用户
提问于 2018-07-27 05:15:38
回答 1查看 26关注 0票数 0

我的JForm UI中有左按钮和右按钮,我希望将"A“和"D”绑定到这些按钮。我一直在尝试在这里关注关于这个的其他帖子,但我似乎仍然不能让它工作。

下面是我的按钮代码:

代码语言:javascript
复制
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);
}     

下面是我的keyBinding代码:

代码语言:javascript
复制
@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {

    int keyPress = e.getKeyCode();
    switch(keyPress) { 
        case KeyEvent.VK_D:
            clickRightActionPerformed(evt);
            break;
        case KeyEvent.VK_A:
            clickLeftActionPerformed(evt);
            break;
    }

@Override
public void keyReleased(KeyEvent e) {

}
EN

回答 1

Stack Overflow用户

发布于 2018-07-27 06:27:19

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

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

代码语言:javascript
复制
public interface MovementController {
    public void moveRight();
    public void moveLeft();
}

(是的,如果是我,我会有一个左右的interface,但我尽量保持简单;)

接下来,您需要设计一些可以与此interface交互的Action

代码语言:javascript
复制
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();
    }

}

最后,我们需要把它全部挖掘出来。

代码语言:javascript
复制
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);
    }

}

通常的建议是,最好将您的UI基于JPanel而不是JFrameJFrame是一个复合组件,这只会增加整个管理的复杂性,从JPanel开始作为基础组件可以让您获得更多自由,并允许您稍后将其添加到任何容器中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51547609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档