So habe ich eine seltsame Art von Fehler festgestellt. Ich verwende ein Kartenlayout, um zwischen einem Hilfebereich und einem Benutzerbereich in einer GUI zu wechseln. Nach dem Start des Programms funktioniert das Kartenlayout wie erwartet und wechselt, wenn der Benutzer "H" drückt, aber wenn Sie auf einen der Buttons klicken oder die Textfelder eingeben, können Sie das Kartenfeld nicht mehr wechseln. Ich habe Orakel-Dokumente durchgesehen, aber nichts gefunden. Weiß jemand, was dieses Problem verursachen könnte?Card Layout wird ursprünglich Schaltfelder wechseln, warum wird es nicht nach dem Start des Programms wechseln?
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
import javax.swing.Timer;
public class MainPanel extends JPanel implements KeyListener{
CardLayout cl = new CardLayout();
userPanel up = new userPanel();
HelpPanel hp = new HelpPanel();
private boolean showUserPanel = true;
private Timer mainTimer = new Timer(500, new ActionListener(){
public void actionPerformed(ActionEvent event){
up.setTipPercent();
}
});
//---------------------------------------------------------------------
//Constructor
public MainPanel(){
setLayout(cl);
add(up, "userPanel");
add(hp, "HelpPanel");
cl.show(this, "userPanel");
addKeyListener(this);
setFocusable(true);
mainTimer.start();
}
//---------------------------------------------------------------------
//Key Listener Methods
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == e.VK_H && showUserPanel == true){
cl.show(this, "HelpPanel");
mainTimer.stop();
showUserPanel = false;
}else if(keyCode == e.VK_H && showUserPanel == false){
cl.show(this, "userPanel");
showUserPanel = true;
mainTimer.start();
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
Dies ist die userPanel
Klasse
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//---------------------------------------------------------------------
public class userPanel extends JPanel{
//Fields
private JButton calc;
private JRadioButton fiveP, tenP, fiftP, twenP;
private ButtonGroup buttonGroup;
private double tipAmount = 0.0;
private JTextField tipArea;
private JTextArea totalArea;
//---------------------------------------------------------------------
//Constructor
public userPanel(){
setBackground(Color.BLACK);
tipArea = new JTextField("Enter bill amount");
totalArea = new JTextArea("");
setupButtons();
tipArea.setPreferredSize(new Dimension(300,40));
totalArea.setPreferredSize(new Dimension(300,40));
}
//---------------------------------------------------------------------
//Setup JComponents
public void setupButtons(){
calc = new JButton("Calculate the Tip");
calc.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
calculateTheTip(tipAmount);
}
});
buttonGroup = new ButtonGroup();
fiveP = new JRadioButton("Five Percent");
tenP = new JRadioButton("Ten Percent");
fiftP = new JRadioButton("Fifteen Percent");
twenP = new JRadioButton("Twenty Percent");
buttonGroup.add(fiveP);
buttonGroup.add(tenP);
buttonGroup.add(fiftP);
buttonGroup.add(twenP);
add(fiveP);
add(tenP);
add(fiftP);
add(twenP);
add(tipArea);
add(totalArea);
add(calc);
}
//---------------------------------------------------------------------
//Calculate the total and display it to the user
public void calculateTheTip(double total){
String theTotal = tipArea.getText();
//Take user input and make sure it is a number
try{
double billAmount = Double.parseDouble(theTotal);
total = billAmount*total;
double totalAmt = billAmount + billAmount*tipAmount;
totalArea.setText("Tip: "+total+ " \nTotal: " + totalAmt);
}catch(NumberFormatException E){
totalArea.setText("Please Enter only the amount without a $ or text!");
}
return;
}
//---------------------------------------------------------------------
//Chose which tipPercent to use
public void setTipPercent(){
if(fiveP.isSelected()){
tipAmount = .05;
}else if(tenP.isSelected()){
tipAmount = .1;
}else if(fiftP.isSelected()){
tipAmount = .15;
}else{
tipAmount = .2;
}
}
}
Dies ist die Help Panel
Klasse
import java.awt.*;
import javax.swing.JPanel;
public class HelpPanel extends JPanel{
public HelpPanel(){
setBackground(Color.BLACK);
}
}
Was meinst du damit, es zu den anderen Komponenten hinzuzufügen? –
@ BobbyC.Robillard Im 'MainPanel''s Konstruktor hast du' addKeyListener (this) '. Dadurch wird der 'KeyListener' zu Ihrer Instanz von' Main Panel' hinzugefügt. Sie müssen dies für die anderen Komponenten wie 'button.addKeyListener (Listener); [This thread] (http://stackoverflow.com/questions/2702203/keyboard-input-for-a-game-in-java/2702391#2702391) könnte helfen. – bradimus
Warum sollte ich den keyListener zur Schaltfläche oder anderen Komponenten hinzufügen? Keiner von denen soll den Fokus haben. Ich verstehe nicht, warum du diesen Thread verlinkt hast, es scheint nicht zu funktionieren, oder wenn ja, kannst du bitte erklären warum? –