将焦点设置在JPanel中

时间:2014-12-15 13:54:53

标签: java swing

我希望我专注于CenterPanel.java,但重点是TopPanel.java课程。

Main.java

public class Main {
    public static void main(String[] args) {
        new MainFrame();
    }
}

MainFrame.java

public class MainFrame extends JFrame {
    public MainFrame() {
        super();
        setTitle("Title");
        setVisible(true);
        MainPanel mainpanel = new MainPanel();
        setContentPane(mainpanel);
        pack();
    }
}

MainPanel.java(从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);
    }
}

TopPanel.java

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);
    }
}

CenterPanel.java

public class CenterPanel extends JPanel {
    public CenterPanel() {
        setFocusable(true);
        setRequestFocusEnabled(true);
        requestFocus();

        addKeyListener(new MoveController());
    }
}

MoveController.java

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");
    }
}

2 个答案:

答案 0 :(得分:3)

setVisible(true)移至main()方法

中的最后一位

从构造函数中移动requestFocus();调用,并在布局完成后调用它(甚至可能在setVisible()调用之后调用它。

注意:使用KeyBindings而不是KeyListener来分离事件会更好。如果您需要重复多个键事件(例如键入)

,KeyListener是很好的

答案 1 :(得分:3)

您应该使用requestFocusInWndow(),而不是requestFocus()。请阅读API文档。

此外,只有在可见GUI中显示组件时,才能请求关注组件。鉴于代码的结构,访问" CenterPanel"并不容易。一旦你使GUI可见。

查看Dialog Focus,其中显示了即使GUI尚未显示,您也可以使用RequestFocusListener请求关注组件。