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