• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Java GridBagLayout Taschnenrechner Problem

Hallo,
ich wollte einen Taschenrechner in Java mit GridBagLayout schreiben.
Nun hab ich das Problem, das bei allen
Code:
Add.addActionListener(this);
die Warnung "Leaking this in constructor" kommt. Um den Fehler zu beheben schlägt
Netbeans vor, in den Optionen "Passing suspicious parameter in the constructor" zu
deaktivieren, was allerdings nicht zur Problemlösung führt.

Ich hoffe ihr könnt mir helfen das Problem zu beheben.
Für Verbesserungsvorschläge am Programm wäre ich auch dankbar,
hier einmal mein Code (ohne WindowClosingAdapter),

Mfg, Max
Code:
package taschenrechner2;

    import java.awt.*;
    import java.awt.event.*;

public class Main
extends Frame
        implements ActionListener
{
    public static void main(String[] args)
    {

        Main wnd = new Main();
        wnd.setVisible(true);
        wnd.setSize(200,200);
    }
    
    Button Add, Min, Mul, Div;
            TextField field1, field2, erg;

    public Main()
    {
        super("Taschenrechner");
        addWindowListener(new WindowClosingAdapter(true));

        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc;
        setLayout(gbl);

           //Zwei Labels und zwei Textfelder
            //Label1
            gbc=makegbc(1,0,1,1);
            gbc.fill = GridBagConstraints.NONE;
            Label label = new Label("Wert1:");
            gbl.setConstraints(label,gbc);
            add(label);

            //Textfeld1
            gbc=makegbc(2,0,1,1);
            gbc.weightx=100;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            field1 = new TextField();
            gbl.setConstraints(field1, gbc);
            add(field1);

            //Label1
            gbc=makegbc(1,1,1,1);
            gbc.fill = GridBagConstraints.NONE;
            label = new Label("Wert2:");
            gbl.setConstraints(label,gbc);
            add(label);

            //Textfeld1
            gbc=makegbc(2,1,1,1);
            gbc.fill = GridBagConstraints.HORIZONTAL;
            field2 = new TextField();
            gbl.setConstraints(field2, gbc);
            add(field2);

            
            //Button +
            gbc=makegbc(1,2,10,1);
            Add = new Button("+");
            gbl.setConstraints(Add, gbc);
            add(Add);
            Add.addActionListener(this);

            gbc=makegbc(2,2,1,1);
            Min = new Button("-");
            gbl.setConstraints(Min, gbc);
            add(Min);
            Add.addActionListener(this);
            //Button *
            gbc=makegbc(1,3,10,1);
            Mul = new Button("*");
            gbl.setConstraints(Mul, gbc);
            add(Mul);
            Add.addActionListener(this);
            //Button /
            gbc=makegbc(2,3,1,1);
            Div = new Button("/");
            gbl.setConstraints(Div, gbc);
            add(Div);
            Add.addActionListener(this);

            //Textfelder
            //Label1
            gbc=makegbc(1,4,1,1);
            gbc.fill = GridBagConstraints.NONE;
            Label Text1= new Label("Ergebnis:");
            gbl.setConstraints(erg,gbc);
            add(erg);

            //Textfeld1
            gbc=makegbc(2,4,1,1);
            gbc.fill = GridBagConstraints.HORIZONTAL;
            erg = new TextField();
            gbl.setConstraints(erg, gbc);
            add(erg);
            erg.addActionListener(this);
            pack();
    }


    public void actionPerformed(ActionEvent ae)
    {
        Object source = ae.getSource();
        double operand1, operand2, var, ergeb;
        String answer;
        operand1 = new Double(field1.getText());
        operand2 = new Double(field2.getText());

        if(source==Add)
        {
            ergeb = operand1 + operand2;
            answer = "ergeb";
            field1.setText(answer);
        }
        if(source==Min)
        {
            ergeb = operand1 - operand2;
            answer = "ergeb";
            erg.setText(answer);
        }
        if(source==Mul)
        {
            ergeb = operand1 * operand2;
            answer = "ergeb";
            erg.setText(answer);
        }
        if(source==Div)
        {
            ergeb = operand1 / operand2;
            answer = "ergeb";
            erg.setText(answer);
        }
    }

    private GridBagConstraints makegbc(int x, int y, int width, int height)
    {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        gbc.insets = new Insets(1, 1, 1, 1);
        return gbc;
    }

}
 
Hallo Xentus,

ich hab deinen Code mal mit javac und anschließend mit java ausgeführt. Den von dir beschriebenen Fehler bekomme ich nicht, dafür aber eine NullPointerException.
Code:
Exception in thread "main" java.lang.NullPointerException
	at java.util.Hashtable.put(Hashtable.java:416)
	at java.awt.GridBagLayout.setConstraints(GridBagLayout.java:499)
	at Main.<init>(Main.java:91)
	at Main.main(Main.java:13)

Da ich heute wenig Zeit hab, werd ich morgen mal über deinen Quelltext drüberschauen,
Nimms mir nicht übel, aber ich finde deinen Quelltext sehr gewöhnungsbedürftig. Weshalb schreibst du denn alles in die Main? Schreib doch erst eine Klasse Taschenrechner und erzeuge diesen dann in der Main... So mach ich das und ich denke die meisten anderen Hobbyprogrammierer auch .

Viele Grüße
earlgrey_tea
 
Sooooo,


ich denke ich hab das Problem gelöst: Du hattest den Fehler in Zeile 91 (sagte ja schon der Compiler).

Code:
        import java.awt.*;
        import java.awt.event.*;

    public class Main
    extends Frame
            implements ActionListener
    {
        public static void main(String[] args)
        {

            Main wnd = new Main();
            wnd.setVisible(true);
            wnd.setSize(200,200);
        }
       
        Button Add, Min, Mul, Div;
                TextField field1, field2, erg;

        public Main()
        {
            super("Taschenrechner");
            //addWindowListener(new WindowClosingAdapter(true));

            GridBagLayout gbl = new GridBagLayout();
            GridBagConstraints gbc;
            setLayout(gbl);

               //Zwei Labels und zwei Textfelder
                //Label1
                gbc=makegbc(1,0,1,1);
                gbc.fill = GridBagConstraints.NONE;
                Label label = new Label("Wert1:");
                gbl.setConstraints(label,gbc);
                add(label);

                //Textfeld1
                gbc=makegbc(2,0,1,1);
                gbc.weightx=100;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                field1 = new TextField();
                gbl.setConstraints(field1, gbc);
                add(field1);

                //Label1
                gbc=makegbc(1,1,1,1);
                gbc.fill = GridBagConstraints.NONE;
                label = new Label("Wert2:");
                gbl.setConstraints(label,gbc);
                add(label);

                //Textfeld1
                gbc=makegbc(2,1,1,1);
                gbc.fill = GridBagConstraints.HORIZONTAL;
                field2 = new TextField();
                gbl.setConstraints(field2, gbc);
                add(field2);

               
                //Button +
                gbc=makegbc(1,2,10,1);
                Add = new Button("+");
                gbl.setConstraints(Add, gbc);
                add(Add);
                Add.addActionListener(this);

                gbc=makegbc(2,2,1,1);
                Min = new Button("-");
                gbl.setConstraints(Min, gbc);
                add(Min);
                Add.addActionListener(this);
                //Button *
                gbc=makegbc(1,3,10,1);
                Mul = new Button("*");
                gbl.setConstraints(Mul, gbc);
                add(Mul);
                Add.addActionListener(this);
                //Button /
                gbc=makegbc(2,3,1,1);
                Div = new Button("/");
                gbl.setConstraints(Div, gbc);
                add(Div);
                Add.addActionListener(this);

                //Textfelder

		//Textfeld1
                gbc=makegbc(2,4,1,1);
                gbc.fill = GridBagConstraints.HORIZONTAL;
                erg = new TextField();
                gbl.setConstraints(erg, gbc);
                add(erg);
                erg.addActionListener(this);
                pack();

                //Label1
                gbc=makegbc(1,4,1,1);
                gbc.fill = GridBagConstraints.NONE;
                Label Text1= new Label("Ergebnis:");
                gbl.setConstraints(erg,gbc);
                add(erg);

                
        }


        public void actionPerformed(ActionEvent ae)
        {
            Object source = ae.getSource();
            double operand1, operand2, var, ergeb;
            String answer;
            operand1 = new Double(field1.getText());
            operand2 = new Double(field2.getText());

            if(source==Add)
            {
                ergeb = operand1 + operand2;
                answer = "ergeb";
                field1.setText(answer);
            }
            if(source==Min)
            {
                ergeb = operand1 - operand2;
                answer = "ergeb";
                erg.setText(answer);
            }
            if(source==Mul)
            {
                ergeb = operand1 * operand2;
                answer = "ergeb";
                erg.setText(answer);
            }
            if(source==Div)
            {
                ergeb = operand1 / operand2;
                answer = "ergeb";
                erg.setText(answer);
            }
        }

        private GridBagConstraints makegbc(int x, int y, int width, int height)
        {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = x;
            gbc.gridy = y;
            gbc.gridwidth = width;
            gbc.gridheight = height;
            gbc.insets = new Insets(1, 1, 1, 1);
            return gbc;
        }

    }

Du wolltest bei Label1 das Textfeld "erg" verwenden, obwohl, dieses noch gar nicht erzeugt worden war. Ich hab folglich einfach erst das Textfeld erzeugt und dann das Label.

Viele Grüe
earlgrey_tea

Ps.: wg. deiner Probleme mit NetBeans kann ich dir leider nicht weiterhelfen..
 
Hallo Xentus,

ich bin eigentlich nicht pingelig, aber eine kurze Rückmeldung , ob der Tipp was war oder nicht hätt ich mir schon gewünscht.

Grüße
earlgrey_tea
 
Hallo,

War leider in der letzten zeit nicht mehr im Forum.
Habe meinen Fehler bereits selbst entdeckt und das Problem auf die selbe weise gelöst.
Trotzdem vielen Dank für deine Lösung,

lg,
Xentus
 
Oben