2016-08-01 32 views
0

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

Antwort

2

Knopfdruck usw., nimmt den Fokus weg von MainPanel. Die KeyEvent s werden an das Objekt gesendet, das den Fokus hat, anstatt MainPanel.

Ich würde vorschlagen, die KeyListener als separates Objekt erstellen und es zu den anderen Komponenten hinzufügen.

+0

Was meinst du damit, es zu den anderen Komponenten hinzuzufügen? –

+1

@ 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

+0

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? –

1

Ihr Programm kann nicht wissen, ob Sie durch Klicken auf H die Taste zum Ändern der Karte drücken oder wenn Sie in eine JTextField schreiben.

Für Ihr Problem verwenden Sie Key Bindings, es ist die beste Lösung dafür, da es den Fokus auf die Komponente, die Sie konzentrieren möchten, ändert. Lesen Sie hierzu die docs.

+0

Ja, ich könnte das tun, aber das ist nicht das Ziel. Aber wenn ich richtig verstehe, wann immer der Benutzer mit einer anderen Komponente des userPanel interagiert, wird der Fokus auf diese Komponente übertragen? –

+1

@ BobbyC.Robillard Ok Ich bearbeitete meine Antwort, stellt sich heraus, dass Key Bindings möglicherweise die beste Lösung für Ihr Problem ist, da das Objekt hier ist der Fokus auf eine bestimmte Komponente, lesen Sie sorgfältig die Dokumente, ich hoffe, dass dies Ihnen helfen wird. –

+0

Ja ich glaube es ist, ich überprüfe derzeit die Dokumente, danke für Ihre Hilfe! –