我的JForm UI中有左按钮和右按钮,我希望将"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);
} 下面是我的keyBinding代码:
@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) {
}发布于 2018-07-27 06:27:19
你在阅读之前有很多东西要读,我建议你从以下内容开始:
您要做的第一件事是将功能解耦。这意味着“向左移动”和“向右移动”操作独立于它们的调用方式,对我来说,这是从interface开始的,它描述了提供的基本契约……
public interface MovementController {
public void moveRight();
public void moveLeft();
}(是的,如果是我,我会有一个左右的interface,但我尽量保持简单;)
接下来,您需要设计一些可以与此interface交互的Action
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);
}
}通常的建议是,最好将您的UI基于JPanel而不是JFrame,JFrame是一个复合组件,这只会增加整个管理的复杂性,从JPanel开始作为基础组件可以让您获得更多自由,并允许您稍后将其添加到任何容器中
https://stackoverflow.com/questions/51547609
复制相似问题