Как добавить функциональный слушатель ключа Java на панель под макетом карты? - PullRequest
0 голосов
/ 27 января 2019

Я проектировал программу, которая имеет несколько слоев (панелей), и я хочу, чтобы эти панели были чувствительными к клавиатуре, чтобы я мог нажать ESC для выхода в главное меню (Первая панель) в любое время.

Вот код панели переключателей, который я написал:

public void switchPane(JPanel jp) {
        frmDavidsAppstore.getContentPane().removeAll();
        frmDavidsAppstore.getContentPane().add(jp);
        frmDavidsAppstore.getContentPane().repaint();
        frmDavidsAppstore.getContentPane().revalidate();
        jp.requestFocusInWindow();

}

Я знаю, что для того, чтобы панель была чувствительной к клавиатуре, она должна быть фокусируемой.

Вот код, который я написал для инициализации одной из панелей:

        panel2 = new JPanel();
        panel2.setFocusable(true);
        frmDavidsAppstore.getContentPane().add(panel2, "name_83147693736131");
        panel2.setLayout(null);

        panel2.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("panel2: " + KeyEvent.getKeyText(e.getKeyCode()));
                if(e.getKeyCode()==KeyEvent.VK_ESCAPE) {
                    switchPane(panel1);
                }
            }
        });
        JButton btnReturnToMain = new JButton("Return to main page");
        btnReturnToMain.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPane(panel1);
            }
        });
        btnReturnToMain.setBounds(279, 431, 236, 50);
        panel2.add(btnReturnToMain);

Я удалил большинство несвязанных функций и кодов.

Что я хочу сделать, так это то, что при нажатии кнопки страницы переключения выполняется метод switchPane, и новая панель автоматически получает фокус с помощью requestFocusInWindow (); команда, так что пользователь может набрать ESC, чтобы вернуться в главное меню.

Когда я пытался запустить программу, оказалось, что я впервые вошел в под-панель, она не может получить фокус и не реагирует на клавиатуру. Однако, если я вернусь на главную панель с помощью кнопки возврата и снова войду в ту же субпанель, на этот раз она автоматически получит фокус и отвечает на клавиатуру.

Понятия не имею, почему программа показывает такое поведение. Ниже приводится полная программа. Обратите внимание, что в полной программе я также добавил щелчок, чтобы получить функцию фокуса, которая работает. Однако мне бы хотелось, чтобы вновь открывшаяся панель могла автоматически фокусироваться и реагировать на нажатия клавиш, не нажимая на нее пользователя.

import java.awt.*;

import javax.swing.JFrame;
import java.awt.CardLayout;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Font;
import javax.swing.JList;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class mainFrame {

    private JFrame frmDavidsAppstore;
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    mainFrame window = new mainFrame();
                    window.frmDavidsAppstore.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public mainFrame() {
        initialize();
    }

    public void switchPane(JPanel jp) {
        frmDavidsAppstore.getContentPane().removeAll();
        frmDavidsAppstore.getContentPane().add(jp);
        frmDavidsAppstore.getContentPane().repaint();
        frmDavidsAppstore.getContentPane().revalidate();
        jp.requestFocusInWindow();
        System.out.println(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner());
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frmDavidsAppstore = new JFrame();
        frmDavidsAppstore.setResizable(false);
        frmDavidsAppstore.setTitle("David's appstore");
        frmDavidsAppstore.setBounds(100, 100, 800, 600);
        frmDavidsAppstore.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmDavidsAppstore.getContentPane().setLayout(new CardLayout(0, 0));

        panel1 = new JPanel();
        panel1.setFocusable(true);
        frmDavidsAppstore.getContentPane().add(panel1, "name_83127645466169");
        panel1.setLayout(null);

        panel1.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("panel1: " + KeyEvent.getKeyText(e.getKeyCode()));
            }
        });

        JButton button2 = new JButton("Open page 2");
        button2.setFont(new Font("Tahoma", Font.PLAIN, 18));
        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPane(panel2);
            }
        });
        button2.setBounds(279, 344, 236, 50);
        panel1.add(button2);

        JButton button3 = new JButton("Open page 3");
        button3.setFont(new Font("Tahoma", Font.PLAIN, 18));
        button3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPane(panel3);
            }
        });
        button3.setBounds(279, 432, 236, 50);
        panel1.add(button3);

        JLabel background = new JLabel("");
        background.setIcon(new ImageIcon(mainFrame.class.getResource("/images/background_main.jpg")));
        background.setBounds(0, 0, 794, 565);
        panel1.add(background);

        panel2 = new JPanel();
        panel2.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                panel2.requestFocusInWindow();
                System.out.println(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner());
            }
        });
        panel2.setFocusable(true);
        frmDavidsAppstore.getContentPane().add(panel2, "name_83147693736131");
        panel2.setLayout(null);

        panel2.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("panel2: " + KeyEvent.getKeyText(e.getKeyCode()));
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    switchPane(panel1);
                }
            }
        });

        JScrollPane scrollPane_1 = new JScrollPane();
        scrollPane_1.setBounds(130, 104, 533, 270);
        panel2.add(scrollPane_1);

        JTextArea txtrIAmPage = new JTextArea();
        txtrIAmPage.setEditable(false);
        scrollPane_1.setViewportView(txtrIAmPage);
        txtrIAmPage.setText("I am page2");

        JButton btnReturnToMain = new JButton("Return to main page");
        btnReturnToMain.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPane(panel1);
            }
        });
        btnReturnToMain.setBounds(279, 431, 236, 50);
        panel2.add(btnReturnToMain);

        panel3 = new JPanel();
        panel3.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                panel3.requestFocusInWindow();
                System.out.println(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner());
            }
        });
        panel3.setFocusable(true);
        frmDavidsAppstore.getContentPane().add(panel3, "name_83334788966651");
        panel3.setLayout(null);

        panel3.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                System.out.println("panel3: " + KeyEvent.getKeyText(e.getKeyCode()));
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    switchPane(panel1);
                }
            }
        });

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(130, 104, 533, 270);
        panel3.add(scrollPane);

        JTextArea txtrIAmPage_1 = new JTextArea();
        scrollPane.setViewportView(txtrIAmPage_1);
        txtrIAmPage_1.setText("I am page3");

        JButton button = new JButton("Return to main page");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switchPane(panel1);
            }
        });
        button.setBounds(279, 431, 236, 50);
        panel3.add(button);
    }
}

Я работаю над этим уже целый день и не могу понять, почему. Ребята, большое спасибо за любую помощь или советы.

Apreciated!

Проблема решена !!! Вам нужно добавить .setVisible (true); before .requestFocusInWindow (); чтобы он работал!

...