我希望我专注于CenterPanel.java
,但重点是TopPanel.java
课程。
public class Main {
public static void main(String[] args) {
new MainFrame();
}
}
public class MainFrame extends JFrame {
public MainFrame() {
super();
setTitle("Title");
setVisible(true);
MainPanel mainpanel = new MainPanel();
setContentPane(mainpanel);
pack();
}
}
Main.java
调用)public class MainPanel extends JPanel {
private TopPanel topPanel;
private CenterPanel centerPanel;
public MainPanel() {
createComponents();
addComponents();
}
private void createComponents() {
centerPanel = new CenterPanel();
topPanel = new TopPanel(centerPanel);
}
private void addComponents() {
add(centerPanel);
add(topPanel, BorderLayout.NORTH);
}
}
public class TopPanel extends JPanel {
private JButton aButton;
private CenterPanel centerPanel;
public TopPanel(CenterPanel c) {
centerPanel = c;
createComponents();
addComponents();
}
private void createComponents() {
aButton = new Button("Button");
}
private void addComponents() {
add(aButton);
}
}
public class CenterPanel extends JPanel {
public CenterPanel() {
setFocusable(true);
setRequestFocusEnabled(true);
requestFocus();
addKeyListener(new MoveController());
}
}
public class MoveController extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Released");
}
}
答案 0 :(得分:3)
将setVisible(true)
移至main()
方法
从构造函数中移动requestFocus();
调用,并在布局完成后调用它(甚至可能在setVisible()
调用之后调用它。
注意:使用KeyBindings而不是KeyListener来分离事件会更好。如果您需要重复多个键事件(例如键入)
,KeyListener是很好的答案 1 :(得分:3)
您应该使用requestFocusInWndow()
,而不是requestFocus()。请阅读API文档。
此外,只有在可见GUI中显示组件时,才能请求关注组件。鉴于代码的结构,访问" CenterPanel"并不容易。一旦你使GUI可见。
查看Dialog Focus,其中显示了即使GUI尚未显示,您也可以使用RequestFocusListener
请求关注组件。