Java 除非最小化或调整JFrame的大小,否则我不能调用事件KeyEvent

Java 除非最小化或调整JFrame的大小,否则我不能调用事件KeyEvent,java,swing,user-interface,jframe,keylistener,Java,Swing,User Interface,Jframe,Keylistener,我在一个班里有三个班。主类将根据用户的输入调用三个类中的一个,如果是B、R或G。B表示蓝色类,R表示红色,G表示绿色 在我调用一个类之后,比如说Blue类,Blue将被添加到容器中,调用它的类将从容器中删除一个panel类 当我按下exit按钮时,blue类将被删除,panel类将再次添加到容器中 我的问题是,在我完成上述场景之后,我不能通过按B、R或G再次调用另一个类。我必须先最小化或调整jframe的大小才能调用一个类。再次 import javax.swing.*; import java

我在一个班里有三个班。主类将根据用户的输入调用三个类中的一个,如果是B、R或G。B表示蓝色类,R表示红色,G表示绿色

在我调用一个类之后,比如说Blue类,Blue将被添加到容器中,调用它的类将从容器中删除一个panel类

当我按下exit按钮时,blue类将被删除,panel类将再次添加到容器中

我的问题是,在我完成上述场景之后,我不能通过按B、R或G再次调用另一个类。我必须先最小化或调整jframe的大小才能调用一个类。再次

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class practice implements KeyListener{
JFrame frame = new JFrame("practice");
JLabel label = new JLabel("Press B, R, or G");
JPanel panel = new JPanel();

public class BLUE implements ActionListener{
    JPanel bluePanel = new JPanel();
    JButton exit = new JButton("exit");
    public BLUE(){
        bluePanel.setPreferredSize(new Dimension(300, 300));
        bluePanel.setFocusable(true);
        bluePanel.setVisible(true);
        bluePanel.requestFocus();
        bluePanel.setBackground(Color.blue);
        bluePanel.add(exit);
        exit.addActionListener(this);
        frame.remove(panel);
        frame.add(bluePanel);
        frame.revalidate();
        frame.repaint();
    }   

    public void actionPerformed(ActionEvent e){
        if(e.getSource().equals(exit)){
            frame.remove(bluePanel);
            frame.add(panel);
            frame.revalidate();
            frame.repaint();
        }
    }           
}


public class RED extends JPanel implements ActionListener{
    JPanel redPanel = new JPanel();
    JButton exit = new JButton("exit");
    public RED(){
        redPanel.setPreferredSize(new Dimension(300, 300));
        redPanel.setFocusable(true);
        redPanel.setVisible(true);
        redPanel.requestFocus();
        redPanel.setBackground(Color.red);
        redPanel.add(exit);
        exit.addActionListener(this);
        frame.remove(panel);
        frame.add(redPanel);
        frame.revalidate();
        frame.repaint();
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource().equals(exit)){
            frame.remove(redPanel);
            frame.add(panel);
            frame.revalidate();
            frame.repaint();
        }
    }           
}

public class GREEN extends JPanel implements ActionListener{
    JPanel greenPanel = new JPanel();
    JButton exit = new JButton("exit");
    public GREEN(){
        greenPanel.setPreferredSize(new Dimension(300, 300));
        greenPanel.setFocusable(true);
        greenPanel.setVisible(true);
        greenPanel.requestFocus();
        greenPanel.setBackground(Color.green);
        greenPanel.add(exit);
        exit.addActionListener(this);
        frame.remove(panel);
        frame.add(greenPanel);
        frame.revalidate();
        frame.repaint();
    }   

    public void actionPerformed(ActionEvent e){
        if(e.getSource().equals(exit)){
            frame.remove(greenPanel);
            frame.add(panel);
            frame.revalidate();
            frame.repaint();
        }
    }           

}

public practice(){  
    frame.setVisible(true);
    frame.setPreferredSize(new Dimension(300, 300));
    frame.setDefaultCloseOperation(3);
    frame.setResizable(false);
    frame.pack();
    frame.setLocationRelativeTo(null);

    initUI();
}

public void initUI(){
    frame.addKeyListener(this);
    panel.add(label);
    panel.setBackground(Color.black);
    frame.add(panel);
}

public void keyReleased(KeyEvent e){
}

public void keyTyped(KeyEvent e){   
}

public void keyPressed(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.VK_B){
        BLUE blue = new BLUE();
    }
    if(e.getKeyCode() == KeyEvent.VK_R){
        RED red = new RED();
    }
    if(e.getKeyCode() == KeyEvent.VK_G){
        GREEN green = new GREEN();
    }
}

public static void main(String[] args){
    practice p = new practice();
}
}

添加keyListener的jframe在没有keyListener的JPanel上请求焦点时失去了焦点。
每次更改jpanels后,请在jframe上使用requestFocus,虽然我不能完全确定,但我无法亲自测试。

不是100%确定,但我认为您的问题在于聚焦的组件。 单击“退出”按钮后,焦点将转移到“退出”按钮,即使稍后将其删除,焦点也不会返回到原始帧。 在退出按钮代码的末尾添加:

frame.requstFocus();

是的,检查过了,这就行了。

我认为问题在于,呼叫后,焦点被赋予了面板,而JFrame则无法监听输入。您想在通话后从面板请求焦点。

因此我将添加frame.requestFocus;在实践课的构造器里面?我说的对吗?不,实际上在调用frame.repaint之后,从代码上看,在添加新的jPanel之前,当前的jPanel似乎从未被删除过。在添加新的jPanelJust frame.removeAll之前,您可能需要先调用frame.removeAll,然后再添加新的jPanelJust frame.removeAll愚蠢的手机自动完成,对不起,请使用而不是KeyListener。在frame.pack.aw之后调用frame.setVisible谢谢。但仍然不起作用。如果我是对的,我只是在我的练习结构中添加了它。你为每个actionPerformed方法添加了什么?现在可以了。我在frame.repaint之后添加了代码。