Java 卡布局最初将切换面板,由why won';程序启动后它是否会切换?

Java 卡布局最初将切换面板,由why won';程序启动后它是否会切换?,java,swing,jpanel,cardlayout,Java,Swing,Jpanel,Cardlayout,所以我遇到了一种奇怪的错误。我使用一个卡片布局在GUI中的帮助面板和用户面板之间切换。最初启动程序时,卡布局按预期工作,并将在用户按下“H”时切换,但如果单击任何按钮或在文本字段中键入,则无法再切换卡面板。我查阅了oracle文档,但什么也没找到。有人知道是什么导致了这个问题吗 导入java.awt.CardLayout; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.awt.event.KeyEven

所以我遇到了一种奇怪的错误。我使用一个卡片布局在GUI中的帮助面板和用户面板之间切换。最初启动程序时,卡布局按预期工作,并将在用户按下“H”时切换,但如果单击任何按钮或在文本字段中键入,则无法再切换卡面板。我查阅了oracle文档,但什么也没找到。有人知道是什么导致了这个问题吗

导入java.awt.CardLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类主面板扩展JPanel实现KeyListener{
CardLayout cl=新的CardLayout();
userPanel up=newuserpanel();
HelpPanel hp=新的HelpPanel();
私有布尔值showUserPanel=true;
专用计时器mainTimer=新计时器(500,新ActionListener(){
已执行的公共无效操作(操作事件){
up.setTipPercent();
}
});
//---------------------------------------------------------------------
//建造师
公共主面板(){
设置布局(cl);
(加上“用户面板”);
添加(hp,“帮助面板”);
cl.show(本“用户面板”);
addKeyListener(此);
设置聚焦(真);
mainTimer.start();
}
//---------------------------------------------------------------------
//关键侦听器方法
按下公共无效键(按键事件e){
int keyCode=e.getKeyCode();
if(keyCode==e.VK_H&&showUserPanel==true){
cl.show(本“帮助面板”);
mainTimer.stop();
showUserPanel=false;
}else if(keyCode==e.VK_H&&showUserPanel==false){
cl.show(本“用户面板”);
showUserPanel=true;
mainTimer.start();
}
}
@凌驾
公共无效密钥已释放(KeyEvent arg0){
//TODO自动生成的方法存根
}
@凌驾
public void keyTyped(KeyEvent arg0){
//TODO自动生成的方法存根
}
}
这是
userPanel

import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.ButtonGroup;
导入javax.swing.JButton;
导入javax.swing.JPanel;
导入javax.swing.JRadioButton;
导入javax.swing.JTextArea;
导入javax.swing.JTextField;
//---------------------------------------------------------------------
公共类userPanel扩展了JPanel{
//田地
私人JButton计算;
私人JRadioButton fiveP、tenP、fiftP、twenP;
私有按钮组按钮组;
私人双tipAmount=0.0;
私人JTextField tipArea;
私人住宅区总面积;
//---------------------------------------------------------------------         
//建造师
公共用户面板(){
挫折背景(颜色:黑色);
tipArea=新的JTextField(“输入票据金额”);
totalArea=新的JTextArea(“”);
设置按钮();
tipArea.setPreferredSize(新尺寸(300,40));
总面积。设置首选尺寸(新尺寸(300,40));
}
//---------------------------------------------------------------------
//设置组件
公共无效设置按钮(){
calc=新按钮(“计算尖端”);
calc.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件){
计算尖端(tipAmount);
}
});
buttonGroup=新建buttonGroup();
fiveP=新的JRadioButton(“百分之五”);
tenP=新的JRadioButton(“百分之十”);
fiftP=新的JRadioButton(“百分之十五”);
twenP=新的JRadioButton(“百分之二十”);
按钮组添加(五页);
按钮组添加(tenP);
按钮组添加(fiftP);
按钮组添加(twenP);
增加(五个);
添加(tenP);
添加(fiftP);
添加(twenP);
添加(蒂帕雷亚);
加(总面积);
添加(计算);
}
//---------------------------------------------------------------------
//计算总数并将其显示给用户
公用事业单位小费(双倍总额){
字符串theTotal=tipArea.getText();
//接受用户输入并确保它是一个数字
试一试{
double billAmount=double.parseDouble(总金额);
合计=账单金额*合计;
double totalAmt=billAmount+billAmount*tipAmount;
totalArea.setText(“提示:+total+”\n总计:+totalAmt);
}捕获(数字格式){
setText(“请只输入金额,不带$或文本!”);
}
返回;
}
//---------------------------------------------------------------------
//选择要使用的tipPercent
公共无效设置{
如果(五个isSelected()){
蒂帕蒙特=.05;
}else if(tenP.isSelected()){
蒂帕蒙特=.1;
}else if(fiftP.isSelected()){
蒂帕蒙特=.15;
}否则{
蒂帕蒙特=.2;
}
}
}
这是
帮助面板

import java.awt.*;
导入javax.swing.JPanel;
公共类帮助面板扩展了JPanel{
公共帮助小组(){
挫折背景(颜色:黑色);
}
}

按下按钮等可将焦点从
主面板上移开。
KeyEvent
s被发送到具有焦点的对象,而不是
MainPanel


我建议将
KeyListener
创建为一个单独的对象,并将其添加到其他组件中

按下按钮等可将焦点从
主面板上移开。
KeyEvent
s被发送到具有焦点的对象,而不是
MainPanel

我建议将
KeyListener
创建为一个单独的对象,并将其添加到另一个co中