【发布时间】:2014-06-04 10:38:49
【问题描述】:
您好,我正在尝试将 KeyListener 添加到 JFrame。我以前做过,而且效果很好。现在我正在复制代码让它监听另一个 JFrame,但现在它由于某种原因停止工作。我不知道我做错了什么。
编辑:看起来一切正常,直到我从屏幕内的 2 个 JPanel 之一按下按钮。之后就好像失去了焦点一样。我该如何解决这个问题?
这是我添加 KeyListener 的新 JFrame 的构造函数:
public class QuizSoftwareView extends JFrame implements View{
private Observable $model;
private Controller $controller;
public EditQuestionsView $editQuestionsView;
public EditTeamsView $editTeamsView;
public AdministratorMenu $adminMenu;
private boolean $isPressed; /* To check if we already listened to a key press event */
/**
* Constructor to make a new quiz
*/
public QuizSoftwareView(Observable model, Controller controller) {
this.setTitle(QuizSoftwareModel.$language.getMessages().getString("title"));
$model = model;
if (controller == null)
$controller = new QuizSoftwareController(model);
else
$controller = controller;
$isPressed = false;
initComponents();
setFocusable(true);
/* Add a keylistener for every team */
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
System.out.println("TEST");
int teamSize; /* team size*/
teamSize = ((QuizSoftwareModel) getModel()).getQuiz().getModel().getTeams().size();
System.out.println(teamSize);
/* F1 is keycode 112, so % 111 gives 1 -> team 1, team 1 gets button F1, team 2 gets button F2 and so on... */
if((e.getKeyCode() % 111) <= teamSize /*&& !alreadyPressed((e.getKeyCode() % 111))*/) { /* If you pressed a number under the teamsize we listen to it, and that team hasn't pressed their button before */
/* Give a pop up message to the admin that a team has pushed their button */
//buttonPressed((e.getKeyCode() % 111));
System.out.println("TESTT");
((QuizSoftwareController)getController()).showScoreView((e.getKeyCode() % 111));
}
}
});
$isPressed = false;
}
}
这是我之前做过的代码(完美):
public class QuizView extends JFrame implements View {
private Observable $model;
private Controller $controller;
private QuestionView $questionView;
private MediaPlayer $mediaView;
private Question $question;
private boolean $isPressed; /* To check if we already listened to a key press event */
public QuizView(Observable model, Controller controller){
setFocusable(true);
$model = model;
if (controller == null)
$controller = new QuizController(model);
else
$controller = controller;
$question = null;
$isPressed = false;
$questionView = new QuestionView($model, null); /* null -> Give the default controller as parameter */
$mediaView = new MediaPlayer($model, null); /* null -> Use default controller */
$model.addObserver($questionView);
$model.addObserver($mediaView);
setTitle("Quiz"); /* Universal word so no messagebundle */
getContentPane().setLayout(new BorderLayout());
getContentPane().add($questionView, BorderLayout.CENTER);
getContentPane().add($mediaView, BorderLayout.EAST);
setExtendedState(this.MAXIMIZED_BOTH);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
((QuizController)getController()).stop();
dispose();
}
});
setFocusable(true);
/* Add a keylistener for every team */
addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int teamSize; /* team size*/
teamSize = ((QuizModel) getModel()).getTeams().size();
/* F1 is keycode 112, so % 111 gives 1 -> team 1, team 1 gets button F1, team 2 gets button F2 and so on... */
if((e.getKeyCode() % 111) <= teamSize && !alreadyPressed((e.getKeyCode() % 111))) { /* If you pressed a number under the teamsize we listen to it, and that team hasn't pressed their button before */
/* Give a pop up message to the admin that a team has pushed their button */
buttonPressed((e.getKeyCode() % 111));
((QuizController)getController()).showScoreView((e.getKeyCode() % 111));
}
}
});
$isPressed = false;
pack();
setVisible(false);
}
}
有人知道怎么了?非常感谢您的帮助,因为这是针对学校的项目。
谢谢!
【问题讨论】:
-
在这里工作正常,假设你让你的 JFrame 可见,“TEST”会在我键入键时出现在控制台中。
-
你尝试过第一个 JFrame 对吗?嗯,让我再检查一次。
-
现在可以了,我们在另一个类中使用了 setVisible 函数,我们现在把它放在构造函数中,现在可以正常工作了。谢谢
-
@Shikamu 还是不行,请检查问题中的EDIT。
标签: java swing jframe keylistener setfocus