2013-04-06 2 views
1

J'ai un peu de problème avec ma calculatrice. Le "GUI" principal a le pavé numérique et quelques opérateurs, mais j'ai ajouté un JMenuItem pour toutes les fonctions trigonmetric comme dans elles ouvrent dans une nouvelle fenêtre. Je n'ai aucun problème à utiliser les opérateurs sur l'interface graphique principale (+, -, sqrt, power etc.) mais je n'arrive pas à faire fonctionner les fonctions trigonométriques. Je mets plus d'informations dans les commentaires de mon code (Lire le commentaire derrière la troisième variable d'instance dernière appelée t).Calculatrice: Impossible d'utiliser ActionListener dans une fenêtre pop-up à partir de mon interface graphique principale

public class Calculator extends JFrame 
{ 
    //TILVIKSBREYTUR  
    JFrame rammi;    //Rammi inniheldur panel 
    JPanel pnl;     //Panel inniheldur takka 
    private final Font BIGGER_FONT = new Font("monspaced", Font.PLAIN, 20); //Letur 
    public JTextField txt;  //Textareitur 
    private JButton b0;   //b0 - b9 eru númeratakkar 
    private JButton b1; 
    private JButton b2; 
    private JButton b3; 
    private JButton b4; 
    private JButton b5; 
    private JButton b6; 
    private JButton b7; 
    private JButton b8; 
    private JButton b9; 
    private JButton bDecPoint; //Decimal point 
    private JButton bc;   //Clear takki, endurstillir textareit 
    private JButton bPlus;  //Plús takki 
    private JButton bMinus;  //Mínus takki 
    private JButton bPower;  //Veldatakki 
    private JButton bSqrt;  //Kvaðratrótartakki 
    private JButton bDivide;  //Deilingar takki 
    private JButton bMult;  //Margföldunar takki 
    private JButton bxRoot;  //N-tu rótartakki 
    private JButton bEqual;  //Jafnt og takki 
    private JButton bPer;  //prósent 
    private JButton bAns;  //síðasta útkoma 
    private JButton bPi;   //Pi 
    private JButton bSvigi1;  //Svigi 
    private JButton bSvigi2;  //Svigi 
    private JSeparator sep1;  //Separator, skilur að textareit og lyklaborð 
    private JSeparator sep2;  //Separatorm skilur að númer og virkja 
    public boolean number;  //tala 
    public boolean degPressed; //Er Degrees valið ? 
    public boolean trigOpen; //Er Trigonmetry flipinn opinn? 
    public boolean trigOpenOp; //hjálpar breyta fyrir virkni 
    public String equalOp;  //Strengur fyrir virkja 
    public String ans; 
    public String ansOp;  //Strengur 
    private JMenuBar menuBar; //Menu bar 
    private JMenu file;   //Flipi í menu bar 
    private JMenuItem trigon; //Hornaföll 
    private JRadioButtonMenuItem deg; //undirgluggi flipa í menubar 
    private JRadioButtonMenuItem rad; //undirgluggi flipa í menubar 

    private Trigonmetry t;  //if I do: private Trigonmetry t = new Trigonmetry then it works 
           //perfectly but if I do that then the Trigonmetry window opens up 
           //when I open the Calculator but I just want Trigonmetry window 
           //to open up when Trigonmetry MenuItem i pressed 

    private CalculatorOp op = new CalculatorOp(); //CalculatorOp classi sem sér um virkni virkjanna 


    public Calculator(){ 
     initUI(); 
    } 

    public final void initUI(){ 
     //TILVIKSBREYTUM GEFID GILDI 
     rammi = new JFrame(); 
     degPressed = false; 
     trigOpen = false; 
     trigOpenOp = false; 
     trigon = new JMenuItem("Trigonmetry"); 
     pnl = new JPanel(); 
     txt = new JTextField("0.0"); 
     menuBar = new JMenuBar(); 
     file = new JMenu("File"); 
     file.setMnemonic(KeyEvent.VK_F); 
     deg = new JRadioButtonMenuItem("Degrees"); 
     rad = new JRadioButtonMenuItem("Radians", true); 
     number = true; 
     equalOp = "="; 
     ansOp = "ANS"; 
     sep1 = new JSeparator(); 
     sep2 = new JSeparator(SwingConstants.VERTICAL); 
     b0 = new JButton("0"); 
     b1 = new JButton("1"); 
     b2 = new JButton("2"); 
     b3 = new JButton("3"); 
     b4 = new JButton("4"); 
     b5 = new JButton("5"); 
     b6 = new JButton("6"); 
     b7 = new JButton("7"); 
     b8 = new JButton("8"); 
     b9 = new JButton("9"); 
     bc = new JButton("C"); 
     bPer = new JButton("%"); 
     bAns = new JButton("ANS"); 
     bDecPoint = new JButton("."); 
     bPlus = new JButton("+"); 
     bMinus = new JButton("-"); 
     bPower = new JButton("x^n"); 
     bSqrt = new JButton("√x"); 
     bxRoot = new JButton("n√x"); 
     bDivide = new JButton("/"); 
     bMult = new JButton("*"); 
     bEqual = new JButton("="); 
     //bSvigi1 = new JButton("("); 
     //bSvigi2 = new JButton(")"); 

     //HÖNNUN RAMMA 
     setTitle("GCalc"); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setMinimumSize(new Dimension(370, 280)); 

     //STADSETNING HLUTA 
     txt.setHorizontalAlignment(JTextField.RIGHT); 
     txt.setFont(BIGGER_FONT); 
     pnl.setLayout(null); 
     //tölur og clear 
     bc.setBounds(10, 10, 50, 30); 
     pnl.add(bc); 
     bDecPoint.setBounds(10, 190, 50, 30); 
     pnl.add(bDecPoint); 
     b0.setBounds(70, 190, 50, 30); 
     pnl.add(b0); 
     b1.setBounds(10, 150, 50, 30); 
     pnl.add(b1); 
     b2.setBounds(70, 150, 50, 30); 
     pnl.add(b2); 
     b3.setBounds(130, 150, 50, 30); 
     pnl.add(b3); 
     b4.setBounds(10, 110, 50, 30); 
     pnl.add(b4); 
     b5.setBounds(70, 110, 50, 30); 
     pnl.add(b5); 
     b6.setBounds(130, 110, 50, 30); 
     pnl.add(b6); 
     b7.setBounds(10, 70, 50, 30); 
     pnl.add(b7); 
     b8.setBounds(70, 70, 50, 30); 
     pnl.add(b8); 
     b9.setBounds(130, 70, 50, 30); 
     pnl.add(b9); 
     //virkjar 
     bAns.setBorder(null); 
     bAns.setBounds(130, 190, 50, 30); 
     pnl.add(bAns); 
     bPlus.setBorder(null); 
     bPlus.setBounds(200, 70, 30, 30); 
     pnl.add(bPlus); 
     bMinus.setBorder(null); 
     bMinus.setBounds(240, 70, 30, 30); 
     pnl.add(bMinus); 
     bSqrt.setBorder(null); 
     bSqrt.setBounds(240, 150, 30, 30); 
     pnl.add(bSqrt); 
     bPower.setBorder(null); 
     bPower.setBounds(200, 150, 30, 30); 
     pnl.add(bPower); 
     bDivide.setBorder(null); 
     bDivide.setBounds(200, 110, 30, 30); 
     pnl.add(bDivide); 
     bMult.setBorder(null); 
     bMult.setBounds(240, 110, 30, 30); 
     pnl.add(bMult); 
     bxRoot.setBorder(null); 
     bxRoot.setBounds(280, 70, 30, 30); 
     pnl.add(bxRoot); 
     bPer.setBorder(null); 
     bPer.setBounds(320, 70, 30, 30); 
     pnl.add(bPer); 
     //bSvigi1.setBorder(null); 
     //bSvigi1.setBounds(280, 110, 30, 30); 
     //pnl.add(bSvigi1); 
     //bSvigi2.setBorder(null); 
     //bSvigi2.setBounds(320, 110, 30, 30); 
     //pnl.add(bSvigi2); 
     bEqual.setBounds(200, 190, 70, 30); 
     pnl.add(bEqual); 
     //seperators & textfield 
     sep1.setBounds(20, 50, 330, 10); 
     pnl.add(sep1); 
     sep2.setBounds(190, 60, 10, 160); 
     pnl.add(sep2); 
     txt.setBounds(70, 10, 280, 30); 
     pnl.add(txt); 
     add(pnl); 

     //Setjum inní Menu 
     file.add(deg); 
     file.add(rad); 
     file.add(trigon); 
     menuBar.add(file); 
     getContentPane().add(menuBar, BorderLayout.NORTH); 

     //HLUTIR SYNILEGIR 
     setVisible(true); 

     //NUMBER LISTENER 
     ActionListener numberListener = new NumberListener(); 
     b0.addActionListener(numberListener); 
     b1.addActionListener(numberListener); 
     b2.addActionListener(numberListener); 
     b3.addActionListener(numberListener); 
     b4.addActionListener(numberListener); 
     b5.addActionListener(numberListener); 
     b6.addActionListener(numberListener); 
     b7.addActionListener(numberListener); 
     b8.addActionListener(numberListener); 
     b9.addActionListener(numberListener); 
     bDecPoint.addActionListener(numberListener); 
     //bSvigi1.addActionListener(numberListener); 
     //bSvigi2.addActionListener(numberListener); 

     //OPERATOR LISTENER 
     ActionListener operatorListener = new OperatorListener(); 
     bPlus.addActionListener(operatorListener); 
     bMinus.addActionListener(operatorListener); 
     bDivide.addActionListener(operatorListener); 
     bMult.addActionListener(operatorListener); 
     bSqrt.addActionListener(operatorListener); 
     bPower.addActionListener(operatorListener); 
     bEqual.addActionListener(operatorListener); 
     bxRoot.addActionListener(operatorListener); 
     bPer.addActionListener(operatorListener); 
     if(trigOpen){ 
     t.bCos.addActionListener(operatorListener); 
     } 
     //ANS LISTENER 
     ActionListener ansListener = new AnsListener(); 
     bAns.addActionListener(ansListener); 

     //CLEAR LISTENER 
     ActionListener clearListener = new ClearListener(); 
     bc.addActionListener(clearListener); 

     //Menu LISTENER 
     ActionListener menuListener = new MenuListener(); 
     trigon.addActionListener(menuListener); 

     //RadioButton LISTENER 
     ActionListener radioListener = new RadioListener(); 
     deg.addActionListener(radioListener); 
     //RadioButton LISTENER 2 
     ActionListener radioListener2 = new RadioListener2(); 
     rad.addActionListener(radioListener2); 


    } 
    /**E: Núllstillir 
    private void action() { 
     number = true; 
     txt.setText("0.0"); 
     equalOp = "="; 
     op.setTotal("0.0"); 
    } */ 

    //VIRKNI RADIO TAKKANS SEM BREYTIR YFIR Í GRÁÐUR 
    class RadioListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      degPressed = true; 
     } 
    } 

    //VIRKNI RADIO TAKKANS SEM BREYTIR YFIR Í RADÍANA 
    class RadioListener2 implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      degPressed = false; 
     } 
    } 

    //VIRKNI CLEAR TAKKANS 
    class ClearListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      txt.setText("0.0"); 
     } 
    } 


    //VIRKNI TRIGONMETRY FLIPA 
    class MenuListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      t = new Trigonmetry(); 
      trigOpen = true; 
     } 
    } 

    //VIRKNI ANS TAKKA 
    class AnsListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      ansOp = e.getActionCommand(); 
      if (ansOp.equals("ANS")) { 
       txt.setText(ans); 
      } 
      else 
       txt.setText("0.0"); 
     } 
    } 


    //VIRKNI TALNA TAKKA 
    class NumberListener implements ActionListener{ 
     public void actionPerformed(ActionEvent event){ 
      String digit = event.getActionCommand(); 
      if (number){ 
       txt.setText(digit); 
       number = false; 
      } 
      else{ 
       txt.setText(txt.getText() + digit); 
      } 
     } 
    } 

    // VIRKNI "VIRKJA" 
    class OperatorListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      if (number){ 
       //action(); 
       txt.setText("0.0"); 
      } 
      else{ 
       number = true; 
       String displayText = txt.getText(); 
       if (equalOp.equals("=")) { 
       op.setTotal(displayText); 
       } 
       else if (equalOp.equals("+")) { 
        op.add(displayText); 
       } 
       else if (equalOp.equals("-")) { 
        op.subtract(displayText); 
       } 
       else if (equalOp.equals("*")) { 
        op.multiply(displayText); 
       } 
       else if (equalOp.equals("/")) { 
        op.divide(displayText); 
       } 
       else if(equalOp.equals("x^n")){ 
        op.power(displayText); 
       } 
       else if(equalOp.equals("√x")){ 
        op.squareRoot(displayText); 
       } 
       else if(equalOp.equals("n√x")){ 
        op.xRoot(displayText); 
       } 
       else if(equalOp.equals("%")){ 
        op.perCent(displayText); 
       } 
      // else if(t.operand.equals("cos")){ 
       // if(degPressed){ 
        // op.cOsDeg(displayText); 
        //} 
        //else 
        // op.cOs(displayText); 
       //} 
       //else if(equalOp.equals("sin")){ 
       // op.sIn(displayText); 
       //} 
       //else if(equalOp.equals("tan")){ 
       // op.tAn(displayText); 
       //} 
       txt.setText("" + op.getTotalString()); 
       ans = txt.getText(); 
       equalOp = e.getActionCommand(); 
       //t.operand = e.getActionCommand(); 

      } 
     } 
    } 

    //*************** MAIN ***************// 
    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run(){ 
       Calculator calc = new Calculator(); 
      } 
     }); 
    } 
} 

Et voici ma classe Tigonmetry, comme vous pouvez le voir, j'essayé de mettre un actionListener là aussi

public class Trigonmetry extends JFrame 
{ 
    JFrame frm;     //rammi 
    public JButton bCos;   //Cosinus 
    public JButton bSin;   //Sinus 
    public JButton bTan;   //Tangens 
    public JButton baCos;  //arc Cosinus 
    public JButton baSin;  //arc Sinus 
    public JButton baTan;  //arc Tangens 
    private JPanel panel;  //Panel 
    public String operand; 
    public Calculator cal; 
    private CalculatorOp opp = new CalculatorOp(); 

    public Trigonmetry(){ 
     InitialUI(); 
    } 

    public final void InitialUI(){ 
     frm = new JFrame(); 
     operand = ""; 
     bCos = new JButton("cos"); 
     bSin = new JButton("sin"); 
     bTan = new JButton("tan"); 
     baCos = new JButton("acos"); 
     baSin = new JButton("asin"); 
     baTan = new JButton("atan"); 
     panel = new JPanel(); 

     //HÖNNUN RAMMA 
     setTitle("Trigonmetry"); 
     setLocationRelativeTo(null); 
     setMinimumSize(new Dimension(180, 110)); 
     panel.setLayout(null); 

     //TAKKAR 
     bSin.setBorder(null); 
     bSin.setBounds(20, 10, 40, 30); 
     panel.add(bSin); 
     bCos.setBorder(null); 
     bCos.setBounds(70, 10, 40, 30); 
     panel.add(bCos); 
     bTan.setBorder(null); 
     bTan.setBounds(120, 10, 40, 30); 
     panel.add(bTan); 
     baCos.setBorder(null); 
     baCos.setBounds(20, 50, 40, 30); 
     panel.add(baCos); 
     baSin.setBorder(null); 
     baSin.setBounds(70, 50, 40, 30); 
     panel.add(baSin); 
     baTan.setBorder(null); 
     baTan.setBounds(120, 50, 40, 30); 
     panel.add(baTan); 
     add(panel); 


     //HLUTIR SYNILEGIR 
     setVisible(true); 

     //OPERATORLISTENER 
     ActionListener operandListener = new OperandListener(); 
     bCos.addActionListener(operandListener); 
     bSin.addActionListener(operandListener); 
     bTan.addActionListener(operandListener); 
    } 
     // VIRKNI "VIRKJA" 
    class OperandListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      if (cal.number){ 
       //action(); 
       cal.txt.setText("0.0"); 
      } 
      else{ 
       cal.number = true; 
       String displayText1 = cal.txt.getText(); 
       if (cal.equalOp.equals("=")) { 
       opp.setTotal(displayText1); 
       } 
       else if(operand.equals("cos")){ 
        if(cal.degPressed){ 
         opp.cOsDeg(displayText1); 
        } 
        else 
         opp.cOs(displayText1); 
       } 
       else if(operand.equals("sin")){ 
        if(cal.degPressed){ 
         opp.sInDeg(displayText1); 
        } 
        else 
         opp.sIn(displayText1); 
       } 
       else if(operand.equals("tan")){ 
        if(cal.degPressed){ 
         opp.tAnDeg(displayText1); 
        } 
        else 
         opp.tAn(displayText1); 
       } 
       cal.txt.setText("" + opp.getTotalString()); 
       operand = e.getActionCommand(); 
      } 
     } 
    } 


} 
+2

trop de code à lire. N'utilisez pas 'setBounds()' pour positionner et dimensionner les composants. Utilisez un gestionnaire de disposition. En outre, une fenêtre contextuelle doit être un JDialog, pas un JFrame. Si vous corrigez ces deux problèmes, je pourrais jeter un coup d'oeil au problème plus tard. – camickr

Répondre

4

de variables Calculatrice de la trigonométrie, cal, est nulle parce qu'elle n'a jamais été initialisé avec le courant Instance de la calculatrice. Vous devez placer l'instance Calculator dans la classe Trigonometry afin que la classe Trig puisse appeler les méthodes publiques de la calculatrice. Une façon de le faire est via un paramètre de constructeur, et une autre façon est via une méthode setter comme setCalculator(Calculator calculator) {...}. Un exemple de la technique des paramètres constructeur:

dans Calculator.java:

Trigonometry t = new Trigonometry(this); 

et en classe trigonométrie:

// constructor now accepts a Calculator parameter 
public Trigonmetry(Calculator calculator) { 
    // initialize the cal field with the current Calculator instance 
    cal = calculator; 
    InitialUI(); 
} 

aussi:

  • Ne pas utiliser setBounds(...) et mise en page nulle selon la recommandation de camickr. Au lieu de lire sur l'utilisation des gestionnaires de disposition, puis utiliser JPanels imbriqués qui utilisent chacun un gestionnaire de disposition approprié.
  • N'utilisez pas plus d'un JFrame. La deuxième fenêtre Trig devrait être un JDialog (également recommandé par camickr).
  • Apprenez et utilisez les conventions de codage Java. Les noms de classe commencent par une lettre majuscule et une méthode et la variable nomme une lettre minuscule. Lorsque vous posez des questions ici, essayez de réduire votre code au minimum qui montre votre problème, permet toujours à votre code de compiler et d'exécuter, mais ne contient aucun code sans rapport avec votre problème. 95% de votre code affiché ci-dessus est inutile pour résoudre le problème et distraire pour nous.

aussi:

  • Si vous ne souhaitez que l'instance trigonométrie pour ouvrir sous le contrôle de la calculatrice, alors ne pas le code pour montrer appelé par trigonométrie, mais plutôt par le calculateur. En d'autres termes, ne faites pas appel à la trigonométrie setVisible(true) sur lui-même, mais faites appel à la calculatrice sur l'instance de trigonométrie.

calculatrice:

class MenuListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    t.setVisible(true); 
    trigOpen = true; 
    } 
} 

trigonométrie:

public final void InitialUI() { // this should be named initialUi() 

    // ..... code deleted for brevity 

    panel.add(baTan); 
    add(panel); 
    // !! setVisible(true); // *** don't call this here *** 
    ActionListener operandListener = new OperandListener(); 

    // ..... code deleted for brevity 

} 
+0

Merci, cela a fonctionné – gthb7

+1

@ user1946287: De rien, mais la prochaine fois, s'il vous plaît, moins * sans lien * code. Essayez de créer et publier un [sscce] (http://sscce.org) si vous avez des problèmes similaires. –

+1

bien expliqué +1 –

Questions connexes