AWT Mit TextField Zahlen einlesen lassen

Brayn

Mitglied
Hallo,

ich bin gerade dran mir ein Programm zu schreiben, dass mir beim berechnen verschiedener Tragsysteme helfen soll.
Die berechnung an sich ist nicht das Problem, denn zuerst habe ich versucht die Eingabe über die Konsole zu machen und das Programm lief auch.
Jetzt möchte ich es meinen Kommilitonen aber auch zur verfügung stellen und es somit auch Benutzerfreundlicher machen. Ich weiß aber leider nicht wie man sich eine Zahl durch ein TextField einlesen lässt.

Hier mal mein Code nur für das Fenster mit TextField.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Flaeche extends JFrame implements KeyListener {

    JPanel panel3 = new JPanel();
    JPanel panel2 = new JPanel();
    JLabel anzeige = new JLabel();
    TextField tf = new TextField("", 20);

    public Flaeche() {

        super("Flächenbelastung eines Tragwerks");
        pack();
        setSize(600, 480);
        setLocation(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
        addKeyListener(this);

        panel2.add(tf);
        getContentPane().add(BorderLayout.NORTH, panel2);


    }

    public void keyTyped(KeyEvent event) {
    }

    public void keyPressed(KeyEvent event) {
        int q = event.getKeyCode();


        anzeige.setText("Ihre Eingabe war" + text);

        anzeige.add(panel2);

        panel3.add(anzeige);
        getContentPane().add(BorderLayout.CENTER, panel2);
        getContentPane().add(BorderLayout.NORTH, panel3);
    }

    public void keyReleased(KeyEvent e) {
    }

    public static void main() {
    }
}

Danke für eure Hilfe, Gruß Matthias
 

Fitzi21

Aktives Mitglied
Du musst den in das Textfeld eingegebenen String in eine Zahl umwandeln

z. B.
Java:
Integer.parseInt(tf.getText());

Gruß Fitzi
 

L-ectron-X

Gesperrter Benutzer
...wenn es ein int-Wert (Ganzzahl) werden soll...
Außerdem mischst du da gerade AWT- und Swing-GUI-Komponenten miteinander. Das solltest du lieber nicht tun. In der FAQ steht auch warum.
 

Attila

Bekanntes Mitglied
1) JFormattedTextField mit MaskFormatter
2) JTextField/JFormattedTextField mit InputVerifier
3) bei JTextField eigene PlainDocument definieren

Gruß Attila
 

Brayn

Mitglied
Hallo,

ich habe mal etwas rumprobiert, aber da ich von AWT noch nicht wirklich viel Ahnung habe fällt mir das ganze noch ziemlich schwer.
Eigentlich wollte ich mir die Zahlen auf einem Label im CENTER ausgeben lassen, da sich aber seit einiger Zeit nichts mehr getan hat, habe ich mir überlegt ich lasse es mir erstmal auf einem TextField ausgeben, macht bestimmt keinen unterschied oder?
Mein eigentliches Problem besteht aber immer noch, nun habe ich noch eine if-Abfrage eingebaut die nur dann eine Ausgabe auf das zweite TextField macht, wenn zuvor Enter gedrückt wurde.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Flaeche extends JFrame implements KeyListener {

    JPanel panel3 = new JPanel();
    JPanel panel2 = new JPanel();
    JLabel anzeige = new JLabel();
    TextField eingabefeld = new TextField("", 20);
    TextField ausgabefeld = new TextField("", 20);

    public Flaeche() {

        super("Flächenbelastung eines Tragwerks");
        pack();
        setSize(600, 480);
        setLocation(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
        addKeyListener(this);

        panel2.add(eingabefeld);
        panel3.add(ausgabefeld);
        getContentPane().add(BorderLayout.NORTH, panel2);
        getContentPane().add(BorderLayout.CENTER, panel3);

    }

    public void keyTyped(KeyEvent event) {
    }

    public void keyPressed(KeyEvent event) {
        int q = event.VK_ENTER;

        int textzahl = Integer.parseInt(eingabefeld.getText());
        if(q == KeyEvent.VK_ENTER){
        ausgabefeld.setText("Ihre Eingabe war" + textzahl);
        }

        
    }

    public void keyReleased(KeyEvent e) {
    }

    public static void main() {
    }
}


Danke schön für eure Hilfe, viele Grüße Matthias
 

Attila

Bekanntes Mitglied
Java:
protected JLabel ausgabeFeld;  //def. als Instanzvariable
//...
JTextField eingabeFeld = new JTextField(5);
eingabeFeld.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
           ausgabeFeld.setText(((JTextField)e.getSource()).getText()) ;
    }
});

// int textzahl = Integer.parseInt(eingabefeld.getText()); ---> NumberFormatException !!!

Java:
JTextField eingabeFeld = new JTextField(5);
eingabeFeld.addActionListener(new ActionListener(){
  	public void actionPerformed(ActionEvent e) {
            int num = 0;
            try {
               num = Integer.parseInt(((JTextField)e.getSource()).getText());
               ausgabeFeld.setText("Ihre Eingabe war "+num);
            }catch (NumberFormatException eN) {
               ausgabeFeld.setText("Ihre Eingabe war nicht korrekt");
            }
        }
});
 
Zuletzt bearbeitet:

Brayn

Mitglied
Hallo Attila,

danke für deine Hilfe, leider weiß ich nicht wo ich dein Code einfügen muss, ich habe es an verschiedenen stellen versucht. So wie er jetzt ist, zeigt er zwar kein Fehler mehr aber es funktioniert immer noch nicht.


Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Flaeche extends JFrame implements KeyListener {

    JPanel panel3 = new JPanel();
    JPanel panel2 = new JPanel();
    JLabel anzeige = new JLabel();
    TextField eingabefeld = new TextField("", 20);
    TextField ausgabefeld = new TextField("", 20);
    protected JLabel ausgabeFeld;  //def. als Instanzvariable
    JTextField eingabeFeld = new JTextField(5);

    public Flaeche() {

        super("Flächenbelastung eines Tragwerks");
        pack();
        setSize(600, 480);
        setLocation(400, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
        setVisible(true);
        addKeyListener(this);

        panel2.add(eingabefeld);
        panel3.add(ausgabefeld);
        getContentPane().add(BorderLayout.NORTH, panel2);
        getContentPane().add(BorderLayout.CENTER, panel3);



        JTextField eingabeFeld = new JTextField(5);
        eingabeFeld.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                ausgabeFeld.setText(((JTextField) e.getSource()).getText());
            }
        });












    }

    public void keyTyped(KeyEvent event) {

//protected JLabel ausgabeFeld;  //def. als Instanzvariable

//        int q = event.VK_ENTER;
//
//        int textzahl = Integer.parseInt(eingabefeld.getText());
//        if(q == KeyEvent.VK_ENTER){
//        ausgabefeld.setText("Ihre Eingabe war" + textzahl);
//        }

//...
        eingabefeld.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int num = 0;
                try {
                    num = Integer.parseInt(((JTextField) e.getSource()).getText());
                    ausgabeFeld.setText("Ihre Eingabe war " + num);
                } catch (NumberFormatException eN) {
                    ausgabeFeld.setText("Ihre Eingabe war nicht korrekt");
                }
            }
        });


    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    public static void main() {
    }
}

viele Grüße Matthias
 

Brayn

Mitglied
Hallo SirWayne,

ehrlich gesagt kann ich mit "JFormattedTextField mit MaskFormatter" noch nicht viel anfangen. Ich habe mir gerade ein Bericht darüber durchgelesen, JFormattedTextField

Wenn ich das richtig verstanden habe, sorgt der "MaskFormatter" dafür das der User eine richtige eingabe macht.

Ich wäre aber schon mit einer falschen Eingabe zufrieden :) hauptsache man kann Zahlen eingeben (am besten double Werte) diese zuvor im Programm mit einer Variablen instanzieren, dann müsste ich an meiner Rechnung nicht mal mehr viel umschreiben. Falls der User eine Null oder im schlimmsten Fall einen String in die Textzeile eingibt, könnte man das bestimmt auch mit einer if-Abfrage klären, aber so speziell muss es garnicht sein.


viele Grüße Matthias
 
G

Gast2

Gast
Hallo SirWayne,

ehrlich gesagt kann ich mit "JFormattedTextField mit MaskFormatter" noch nicht viel anfangen. Ich habe mir gerade ein Bericht darüber durchgelesen, JFormattedTextField

Wenn ich das richtig verstanden habe, sorgt der "MaskFormatter" dafür das der User eine richtige eingabe macht.

Ich wäre aber schon mit einer falschen Eingabe zufrieden :) hauptsache man kann Zahlen eingeben (am besten double Werte) diese zuvor im Programm mit einer Variablen instanzieren, dann müsste ich an meiner Rechnung nicht mal mehr viel umschreiben. Falls der User eine Null oder im schlimmsten Fall einen String in die Textzeile eingibt, könnte man das bestimmt auch mit einer if-Abfrage klären, aber so speziell muss es garnicht sein.


viele Grüße Matthias

Dann solltest du dir unbedingt das Listener Konzept nochmal anschauen, ich denke da hast du einiges nicht verstanden und für die Swing programmierung essentiell...
How to Write an Action Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)

Oben wurde eigentlich schon des komplette Code geschrieben du musst ihn nur richtig einfügen. Aber wenn du das Konzept verstanden hast dann weißt du wo du ihn einsetzen musst ;)

Tip ein ActionListener auf einem JTextfield reagiert die actionPerfomed Methode auf "Enter"
 
C

Camino

Gast
Hallo SirWayne,

ehrlich gesagt kann ich mit "JFormattedTextField mit MaskFormatter" noch nicht viel anfangen. Ich habe mir gerade ein Bericht darüber durchgelesen, JFormattedTextField

Wenn ich das richtig verstanden habe, sorgt der "MaskFormatter" dafür das der User eine richtige eingabe macht.

Mit dem MaskFormatter oder NumberFormatter kannst du eine Maske festlegen, welche nur die von dir gewünschten Zeichen (und auch Zeichenanzahl) eingeben lässt. Andere Zeichen werden während der Eingabe erst garnicht angenommen.

Mit einem InputVerifier kannst du einen Wert nach Verlassen des Texteingabefeldes (z.B. durch Enter, Tab, Mausklick) überprüfen, ob die im Textfeld befindlichen Zeichen deinen Wünschen entsprechen. Falls nicht, kannst du das Verlassen des Textfeldes verhindern und z.B. eine Fehlermeldung ausgeben.

In deinem Code hast du einiges an Chaos drin. Du hast AWT und Swing vermischt (z.B. TextField und JTextField). Manche Sachen hast du auch mehrmals initialisiert. Beim JFrame solltest du pack() und setVisible() erst am Schluss aufrufen.

Damit es übersichtlicher wird: Nimm einfach mal die falschen und unnötigen Sachen raus (auch den KeyListener) und schau, was mit dem ActionListener auf dem JTextField passiert. Wie oben schon geschrieben wurde, kannst du nach Betätigen der Enter-Taste in der actionPerfomed-Methode etwas mit dem Inhalt deines JTextFields machen, zum Beispiel deine Berechnung und dann eine Ausgabe auf einem JLabel.
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
Das ist aber nicht der Grund warum es am Schluss stehen soll ;)
Das
Code:
Damit es übersichtlicher wird:
hat einen Doppelpunkt hinter sich und bezieht sich auf den nächsten (Teil-)Satz...
Hab dort mal ne Zeilenschaltung eingefügt, damit es nicht zur Verwirrung führt. ;-)
 
Zuletzt bearbeitet von einem Moderator:

Brayn

Mitglied
Hallo,

ich habs geschafft :) aber nur dank euch. Vielen Dank für eure Hilfe.
Ich habe jedoch noch eine Frage. So wie mein Code jetzt ist, Funktioniert die Ausgbae meiner ersten Eingabe erst nach dem zweiten drücken von Enter. Woran liegt das? Danach reicht es wenn man einmal mit Enter bestätigt.


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

import javax.swing.*;

public class MainClass extends JPanel implements ActionListener {

    JTextField jtf = new JTextField(15);
    static JPanel panel2 = new JPanel();
    JLabel ausgabeFeld = new JLabel();

    public MainClass() {

        add(jtf);
        jtf.addActionListener(this);
        panel2.add(ausgabeFeld);

    }

    
    public void actionPerformed(ActionEvent ae) {
      


        jtf.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                double num = 0.0;
                try {
                    num = Integer.parseInt(((JTextField) e.getSource()).getText());
                    ausgabeFeld.setText("Ihre Eingabe war " + num);
                } catch (NumberFormatException eN) {
                    ausgabeFeld.setText("Ihre Eingabe war nicht korrekt");
                }
            }
        });

    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.getContentPane().add(new MainClass());
        frame.getContentPane().add(BorderLayout.NORTH, panel2);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 480);
        frame.setLocation(400, 200);
        frame.setResizable(true);
        frame.setVisible(true);
    }
}

viele Grüße Matthias
 
C

Camino

Gast
Du hast dem Textfeld den ActionListener einmal zuviel zugewiesen und zwei verschachtelte actionPerformed-Methoden... Beim zweiten Mal bekommt das Textfeld innerhalb der actionPerformed-Methode nochmal einen neuen ActionListener verpasst, der erstmal wieder mit einer actionPerformed-Methode auf die Enter-Taste wartet - deshalb wird das erst nach dem zweiten Mal ausgeführt.
Nimm die Zuweisung in der actionPerforned-Methode mal raus...
Java:
...
public MainClass() {
 
        add(jtf);
        jtf.addActionListener(this);      // <-- einmal hier
        panel2.add(ausgabeFeld);
 
    }

...

    public void actionPerformed(ActionEvent ae) {
      
 
 
        jtf.addActionListener(new ActionListener() {     // <-- und ein zweites mal hier
 
            public void actionPerformed(ActionEvent e) {
                double num = 0.0;
                try {
                    num = Integer.parseInt(((JTextField) e.getSource()).getText());
                    ausgabeFeld.setText("Ihre Eingabe war " + num);
                } catch (NumberFormatException eN) {
                    ausgabeFeld.setText("Ihre Eingabe war nicht korrekt");
                }
            }
        });
 
    }

...

So besser:
Java:
...
public MainClass() {
 
        add(jtf);
        jtf.addActionListener(this);      // <-- einmal hier
        panel2.add(ausgabeFeld);
 
    }

...
    public void actionPerformed(ActionEvent e) {

                double num = 0.0;
                try {
                    num = Integer.parseInt(((JTextField) e.getSource()).getText());
                    ausgabeFeld.setText("Ihre Eingabe war " + num);
                } catch (NumberFormatException eN) {
                    ausgabeFeld.setText("Ihre Eingabe war nicht korrekt");
                }

 
    }
...
 
Zuletzt bearbeitet von einem Moderator:

Brayn

Mitglied
Hallo ihr lieben,

danke euch hab ich es fast geschafft. :)
Ich habe nur noch ein formelles Problem, wenn ich mir etwas in der Konsole ausgeben möchte und ich will an einer ganz bestimmten stelle ein Zeilenumbruch machen, so schreiben ich einfach "\n" das funktioniert leider nicht wenn man sich etwas im Fenster ausgeben lassen möchte. Gibt es dafür ein anderes Symbol etc.?
Denn ich möchte mir die Rechenschritte untereinander anzeigen lassen.

Hier noch mein fast vollendeter Code

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

import javax.swing.*;

public class Flaeche extends JPanel implements ActionListener {

    JTextField jtf1 = new JTextField("0.0", 30);
    JTextField jtf2 = new JTextField("0.0", 30);
    JTextField jtf3 = new JTextField("0.0", 30);
    static JPanel panel1 = new JPanel();
    static JPanel panel2 = new JPanel();
    static JPanel panel3 = new JPanel();
    JLabel ausgabeFeld1 = new JLabel();
    JLabel ausgabeFeld2 = new JLabel();
    JLabel ausgabeFeld3 = new JLabel();
    static JPanel platzhalter1 = new JPanel();
    static JPanel platzhalter2 = new JPanel();
    JLabel ph1 = new JLabel();
    JLabel ph2 = new JLabel();
    JLabel anzeige = new JLabel("Geben Sie nacheinander für folgende Variablen (q, l1, l2) ihre Werte ein.");

    public Flaeche() {

        // add(jtf);
        jtf1.addActionListener(this);
        jtf2.addActionListener(this);
        jtf3.addActionListener(this);

        panel1.add(anzeige);
        panel2.setLayout(new GridLayout(3, 1, 10, 10));
        jtf1.setPreferredSize(new Dimension(10, 10));
        jtf2.setPreferredSize(new Dimension(10, 10));
        jtf3.setPreferredSize(new Dimension(10, 10));
        panel2.add(jtf1);
        panel2.add(jtf2);
        panel2.add(jtf3);


        panel3.setLayout(new GridLayout(3, 1, 10, 10));
        ausgabeFeld1.setPreferredSize(new Dimension(50, 50));
        ausgabeFeld2.setPreferredSize(new Dimension(50, 50));
        ausgabeFeld3.setPreferredSize(new Dimension(50, 50));
        panel3.add(ausgabeFeld1);
        panel3.add(ausgabeFeld2);
        panel3.add(ausgabeFeld3);



        ph1.setLayout(new GridLayout(1, 1, 100, 100));
        ph2.setLayout(new GridLayout(1, 1, 100, 100));
        platzhalter1.add(ph1);
        platzhalter1.add(ph2);



    }

    public void actionPerformed(ActionEvent e) {

        double q = 0.0;
        double av = 0.0;
        double bv = 0.0;
        try {
            q = Double.parseDouble(((JTextField) e.getSource()).getText());

            ausgabeFeld1.setText("Summe von H=0   => Ah = 0                        " + q);


        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }


        try {

            av = Double.parseDouble(((JTextField) e.getSource()).getText());
            double tges = 0;

            tges = q + av;




            ausgabeFeld2.setText("Summe von M=0   => Bv * l2 - q * l2 = 0             " + tges);


        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }


        try {

            bv = Double.parseDouble(((JTextField) e.getSource()).getText());
            double ges = 0;

            ges = q + av + bv;


            ausgabeFeld3.setText("Summe von V=0   => Av + Bv - q = 0                   " + ges);


        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }


    }

    public static void main() {

        JFrame frame = new JFrame();
        //frame.getContentPane().add(new Flaeche());
        frame.getContentPane().add(BorderLayout.NORTH, panel1);
        frame.getContentPane().add(BorderLayout.CENTER, panel2);
        frame.getContentPane().add(BorderLayout.SOUTH, panel3);
        frame.getContentPane().add(BorderLayout.EAST, platzhalter1);
        frame.getContentPane().add(BorderLayout.WEST, platzhalter2);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 480);
        frame.setLocation(400, 200);
        frame.setResizable(true);
        frame.setVisible(true);
    }
}

viele Grüße Matthias
 

Brayn

Mitglied
Hi,

ich habe mein Problem gerade gelöst. Falls es jemanden noch nicht weiß und interessiert.

Java:
ausgabeFeld3.setText("<html>Bezeichner: Text:Summe von V=0   => Av + Bv - q = 0 <br> Av = q - Bv</html>");

ausgabeFeld3 ist als JLabel instanziert und mit jedem <br> macht man einen Zeilenumbruch man muss allerdings wie in dem Beispiel den Text mit <html> beginnen und ihn mit </html> beenden.

viele Grüße Matthias
 

Brayn

Mitglied
Ich habe ein neues Problem, :( es geht um das Layout.
Wenn ich das Programm aufrufe sehe ich manche Zeilen nicht, ich schätze das liegt daran dass ich ein schlechtes Layout gewählt habe, meine Textfelder sind auch viel zu groß, außerdem müssten sie sich ja nicht mit der Fenstergröße verändern. Ich habe mal etwas von setBounds gelesen, kann man das auch zur Panel bzw. Label ausrichtung nehmen?
Wenn ja wie funktioniert das dann, setbounds verlangt doch vier Zahlen, für was stehen die denn?


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

import javax.swing.*;

public class Flaeche extends JPanel implements ActionListener {

    JTextField jtf1 = new JTextField("0.0", 30);
    JTextField jtf2 = new JTextField("0.0", 30);
    JTextField jtf3 = new JTextField("0.0", 30);
    static JPanel panel1 = new JPanel();
    static JPanel panel2 = new JPanel();
    static JPanel panel3 = new JPanel();
    JLabel ausgabeFeld1 = new JLabel();
    JLabel ausgabeFeld2 = new JLabel();
    JLabel ausgabeFeld3 = new JLabel();
    static JPanel platzhalter1 = new JPanel();
    static JPanel platzhalter2 = new JPanel();
    JLabel ph1 = new JLabel();
    JLabel ph2 = new JLabel();
    JLabel anzeige = new JLabel("Geben Sie nacheinander für folgende Variablen (q, l1, l2) ihre Werte ein.");

    public Flaeche() {

        // add(jtf);
        jtf1.addActionListener(this);
        jtf2.addActionListener(this);
        jtf3.addActionListener(this);

        panel1.add(anzeige);
        panel2.setLayout(new GridLayout(3, 1, 10, 10));
        jtf1.setPreferredSize(new Dimension(10, 10));
        jtf2.setPreferredSize(new Dimension(10, 10));
        jtf3.setPreferredSize(new Dimension(10, 10));
        panel2.add(jtf1);
        panel2.add(jtf2);
        panel2.add(jtf3);


        panel3.setLayout(new GridLayout(3, 1, 10, 10));
        ausgabeFeld1.setPreferredSize(new Dimension(50, 50));
        ausgabeFeld2.setPreferredSize(new Dimension(50, 50));
        ausgabeFeld3.setPreferredSize(new Dimension(50, 50));
        panel3.add(ausgabeFeld1);
        panel3.add(ausgabeFeld2);
        panel3.add(ausgabeFeld3);



        ph1.setLayout(new GridLayout(1, 1, 200, 200));
        ph2.setLayout(new GridLayout(1, 1, 200, 200));
        platzhalter1.add(ph1);
        platzhalter1.add(ph2);



    }

    public void actionPerformed(ActionEvent e) {

        double q = 0.0;
        double l1 = 0.0;
        double l2 = 0.0;
        try {
            q = Double.parseDouble(jtf1.getText());

//Double.parseDouble(((JTextField) e.getSource()).getText());
            ausgabeFeld1.setText("Summe von H=0   => Ah = 0");


        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }

        try {

            l1 = Double.parseDouble(jtf2.getText());

            double tges = 0;

            tges = q * l1 / l2;




            ausgabeFeld2.setText("<html>Summe von M=0   => Bv * l2 - q * l1 = 0 |Umstellen nach Bv; *(-1); :l2 <br>  <TR><TR><TR> (q*l1)/l2 = Bv  |Zahlen einsetzen<br><TD><TD><TD>"
                    + "(" + q + "*" + l1 + ") / " + l2 + " = Bv |ausrechnen<br> <TD><TD><TD>" + tges + " = Bv</html>");


        } catch (NumberFormatException eN) {
            ausgabeFeld2.setText("Ihre Eingabe war nicht korrekt");
        }


        try {

            l2 = Double.parseDouble(jtf3.getText());
            double ges = 0;

            ges = q + l1 + l2;

//            Summe von V=0   => Av + Bv - q = 0
            ausgabeFeld3.setText("<html>Summe von V=0   => Av + Bv - q = 0 <br>            Av = q - Bv<br>           " + q + "      + l1 +l2 =        " + ges + "      " + l2 + "</html>");

        } catch (NumberFormatException eN) {
            ausgabeFeld3.setText("Ihre Eingabe war nicht korrekt");
        }


    }

    public static void main() {

        JFrame frame = new JFrame();
        frame.pack();
        //frame.getContentPane().add(new Flaeche());
        frame.getContentPane().add(BorderLayout.NORTH, panel1);
        frame.getContentPane().add(BorderLayout.CENTER, panel2);
        frame.getContentPane().add(BorderLayout.SOUTH, panel3);
        frame.getContentPane().add(BorderLayout.EAST, platzhalter1);
        frame.getContentPane().add(BorderLayout.WEST, platzhalter2);


        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(600, 480);
        frame.setLocation(400, 200);
        frame.setResizable(true);
        frame.setVisible(true);
    }
}

danke schon mal für eure Antworten

viele Grüße Matthias
 
Zuletzt bearbeitet:
C

Camino

Gast
Das Verhalten wird vom LayoutManager (bei dir GridLayout) bestimmt. Du könntest vielleicht einen anderen LayoutManager nehmen, z.B. BoxLayout oder GridBagLayout...
 
Zuletzt bearbeitet von einem Moderator:
C

Camino

Gast
Hmmm, noch ein paar Sachen:

- die main-Methode musst du so schreiben:
Code:
public static void main(String[] args)

- du weisst deinem JFrame in der main-Methode die verschiedenen Panel in ein BorderLayout zu. Aber du hast die Panel zu diesem Zeitpunkt ja noch garnicht erstellt. Du musst zuerst ein Objekt der Klasse Flaeche erstellen, in welchem dann auch die Panel und Textfelder sowie Label erstellt werden.

- das frame.pack() nützt dir an dieser Stelle nicht viel, da du ja danach erst die Grösse des Frames festlegst.
 
C

Camino

Gast
Ich hab dir deinen Code mal ein bisschen umgeschrieben und vereinfacht. Ich hab mal für das JPanel (Flaeche) ein BoxLayout genommen und das ganze dann in den JFrame eingefügt. Das BoxLayout und die Grössen der Komponenten musst du evtl. noch anpassen. Die Ausgabetexte sind wohl ein bisschen zu gross, also zu viele Zeilen für die Label. Musst du nochmal ein bisschen anpassen.

Java:
import java.awt.*;
import java.awt.event.*;
 
import javax.swing.*;
 
public class Flaeche
extends JPanel
implements ActionListener {
 
    private JTextField jtf1, jtf2, jtf3;
    private JLabel anzeige, ausgabeFeld1, ausgabeFeld2, ausgabeFeld3;

    
    public Flaeche() {
    	
    	// Texteingabefelder
    	jtf1 = new JTextField("0.0", 30);
        jtf2 = new JTextField("0.0", 30);
        jtf3 = new JTextField("0.0", 30);
        
        jtf1.setPreferredSize(new Dimension(100, 20));
        jtf2.setPreferredSize(new Dimension(100, 20));
        jtf3.setPreferredSize(new Dimension(100, 20));
        
        // Textausgabe
        ausgabeFeld1 = new JLabel();
        ausgabeFeld2 = new JLabel();
        ausgabeFeld3 = new JLabel();
        
        ausgabeFeld1.setPreferredSize(new Dimension(50, 80));
        ausgabeFeld2.setPreferredSize(new Dimension(50, 80));
        ausgabeFeld3.setPreferredSize(new Dimension(50, 80));
        
        // Anzeigetext
        anzeige = new JLabel("Geben Sie nacheinander für folgende Variablen (q, l1, l2) ihre Werte ein.");
 
        // ActionListener hinzufügen (bei Enter-Taste -> actionPerformed)
        jtf1.addActionListener(this);
        jtf2.addActionListener(this);
        jtf3.addActionListener(this);
        
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        this.add(anzeige);
        this.add(Box.createRigidArea(new Dimension(10, 10)));        
        this.add(jtf1);
        this.add(Box.createRigidArea(new Dimension(10, 10)));
        this.add(jtf2);
        this.add(Box.createRigidArea(new Dimension(10, 10)));
        this.add(jtf3);
        this.add(Box.createRigidArea(new Dimension(10, 10)));
        this.add(ausgabeFeld1);
        this.add(Box.createRigidArea(new Dimension(10, 10)));
        this.add(ausgabeFeld2);
        this.add(Box.createRigidArea(new Dimension(10, 10)));
        this.add(ausgabeFeld3);
        this.add(Box.createVerticalGlue());
 
 
 
    }
 
    public void actionPerformed(ActionEvent e) {
 
        double q = 0.0;
        double l1 = 0.0;
        double l2 = 0.0;
        try {
            q = Double.parseDouble(jtf1.getText());
 
//Double.parseDouble(((JTextField) e.getSource()).getText());
            ausgabeFeld1.setText("Summe von H=0   => Ah = 0");
 
 
        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }
 
        try {
 
            l1 = Double.parseDouble(jtf2.getText());
 
            double tges = 0;
 
            tges = q * l1 / l2;
 
 
 
 
            ausgabeFeld2.setText("<html>Summe von M=0   => Bv * l2 - q * l1 = 0 |Umstellen nach Bv; *(-1); :l2 <br>  <TR><TR><TR> (q*l1)/l2 = Bv  |Zahlen einsetzen<br><TD><TD><TD>"
                    + "(" + q + "*" + l1 + ") / " + l2 + " = Bv |ausrechnen<br> <TD><TD><TD>" + tges + " = Bv</html>");
 
 
        } catch (NumberFormatException eN) {
            ausgabeFeld2.setText("Ihre Eingabe war nicht korrekt");
        }
 
 
        try {
 
            l2 = Double.parseDouble(jtf3.getText());
            double ges = 0;
 
            ges = q + l1 + l2;
 
//            Summe von V=0   => Av + Bv - q = 0
            ausgabeFeld3.setText("<html>Summe von V=0   => Av + Bv - q = 0 <br>            Av = q - Bv<br>           " + q + "      + l1 +l2 =        " + ges + "      " + l2 + "</html>");
 
        } catch (NumberFormatException eN) {
            ausgabeFeld3.setText("Ihre Eingabe war nicht korrekt");
        }
 
 
    }
 
    public static void main(String[] args) {
 
        JFrame frame = new JFrame();
        
        frame.setSize(600, 480);
        frame.setLocation(400, 200);
        
        frame.getContentPane().add(BorderLayout.CENTER, new Flaeche());
 
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        
        frame.setResizable(true);
        frame.pack();
        frame.setVisible(true);
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Brayn

Mitglied
Hallo Camino,

gut dass du es ansprichst.
Dass ich die main Methode so
Java:
public static void main(String[] args)
schreiben muss wusste ich, ABER da die Klasse Flaeche duch einen ActionListener von der Klassr Prog1 aufgerufen wird, geht das anscheinend nicht. Ich habe eigentlich alles versucht, zuerst habe ich in der Klasse Prog1 in der Methode ActionListener auch n.main(String[] args) eingegeben, dann dachte ich mir, "kann ja nicht sein", der verlangt doch ein übergabe Parameter, also habe ich den String "Punkt" zu testzwecken übergegeben, und ihn in der Klasse Flaeche als Titel benutzt, so dass ich dort frame.setTitle(args) schrieb. Es war wohl kein Fehler, denn compiliert hat er alles, doch was mich jetzt noch nervt, überall kann ich mit "setTitle" oder mit super("...") den Titel des Fensters angeben, doch in meinem letzten Fenster irgend wie nicht...seltsam.
Dann noch etwas seltsames, wenn ich das Fenster Flaeche duch einen klick auf den Button öffne, geht das Fenster normal auf, schließe ich es aber und mache es erneut auf dann kommen auf einmal alle Textfelder, Labels etc. doppelt und bei einem erneuten schließen und öffnen kommen wieder zweineue dazu. Ich dachte zuerst daran dass ich etwas zwei mal aufrufe, dann sah ich nochmal genau nach, habe aber nichts gefunden. Mitlerweile denke ich dass ich irgendwo noch etwas wie System.exit(0) und dispose() reinbringen muss, das habe ich aber nur in meinem Java buch gelesen, keine Ahnung ob ich das auch brauche.

Nun hier sind mal alle drei Klassen:
Prog1 (MainClass)
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.*;


public class Prog1 extends JFrame{
//  Wo ist der Fehler?
//    public static void Fenster(){
//        JFrame frame = new JFrame();
//        super("Fenster");
//        frame.setSize(500, 800);
//        frame.setLocation(300, 150);
//    }


//        Punkt p = new Punkt();
//        Flaeche f = new Flaeche();


        

    public Prog1(){
        super("Übersicht");

        //Panels erstellen
        JPanel background = new JPanel();
        JPanel panel1 = new JPanel();
        JPanel buttonpanel = new JPanel();
        

        //Labels und Hintergrundbild erstellen
        JLabel bild = new JLabel(new ImageIcon("Systeme.gif"), SwingConstants.CENTER);
        JLabel frage = new JLabel("Wählen Sie eines der beiden Systeme aus");
        frage.setFont(new Font("Times New Roman", Font.PLAIN , 25));

        


        //Buttons festlegen
        JButton button1 = new JButton("System 1");
        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub

               Punkt n = new Punkt();
               //SchnittkraftPunkt schnittkraft = new SchnittkraftPunkt();
               n.main();



            }
        });


         JButton button2 = new JButton("System 2");
         button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg1) {
                // TODO Auto-generated method stub

                Flaeche f = new Flaeche();
               // SchnittkraftPunkt schnittkraft = new SchnittkraftPunkt();
               f.main();

            }

        });

        //Labels und Buttons auf Panels befestigen
        background.add(bild);
        panel1.add(frage);
        buttonpanel.add(button1);
        buttonpanel.add(button2);

        buttonpanel.setLayout(new GridLayout(1, 2, 10, 10));
        button1.setPreferredSize(new Dimension(200, 20));
        button2.setPreferredSize(new Dimension(200, 20));


        //Sichtbarkeit festlegen
        getContentPane().add(BorderLayout.EAST, buttonpanel);
        getContentPane().add(BorderLayout.WEST, frage);
        getContentPane().add(BorderLayout.SOUTH, bild);

    }



    public static void main(String[] args){

        Prog1 frame = new Prog1();
        //frame.pack();
        frame.setSize(900, 700);
        frame.setLocation(5, 30);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);

        
       
    }

}



Punkt(SubClass von Prog1) Punkt und Flaeche unterscheiden sich nur von der Rechnung.


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

import javax.swing.*;

public class Punkt extends JFrame implements ActionListener {

    JTextField jtf1 = new JTextField("Kraft F [KN/m]", 30);
    JTextField jtf2 = new JTextField("Länge l1 [m]", 30);
    JTextField jtf3 = new JTextField("Länge l2 [m]", 30);
    static JPanel panel1 = new JPanel();
    static JPanel panel2 = new JPanel();
    static JPanel panel3 = new JPanel();
    JLabel ausgabeFeld1 = new JLabel();
    JLabel ausgabeFeld2 = new JLabel();
    JLabel ausgabeFeld3 = new JLabel();
    static JPanel platzhalter1 = new JPanel();
    static JPanel platzhalter2 = new JPanel();
    JLabel ph1 = new JLabel();
    JLabel ph2 = new JLabel();
    Font f = new Font("Times New Roman", Font.PLAIN, 25);
    static JPanel schnittpanel = new JPanel();
    JButton schnitt = new JButton("Schnittkraftberechnung");

    public Punkt() {


        // add(jtf);

        JLabel anzeige = new JLabel("<html><u>" + "Hier können Sie ihre Eingabe machen" + "</u></html>");
        anzeige.setFont(new Font("Times New Roman", Font.PLAIN, 25));


        jtf1.addActionListener(this);
        jtf2.addActionListener(this);
        jtf3.addActionListener(this);

        panel1.add(anzeige);
        //panel2.setLayout(new GridLayout(3, 1, 100, 100));
        panel2.setBounds(30, 30, 100, 100);
        jtf1.setPreferredSize(new Dimension(30, 30));
        jtf2.setPreferredSize(new Dimension(30, 30));
        jtf3.setPreferredSize(new Dimension(30, 30));
        panel2.add(jtf1);
        panel2.add(jtf2);
        panel2.add(jtf3);

        //
        panel3.setLayout(new GridLayout(3, 1, 10, 10));
        ausgabeFeld1.setPreferredSize(new Dimension(100, 100));
        ausgabeFeld2.setPreferredSize(new Dimension(100, 100));
        ausgabeFeld3.setPreferredSize(new Dimension(100, 100));
        panel3.add(ausgabeFeld1);
        panel3.add(ausgabeFeld2);
        panel3.add(ausgabeFeld3);



        ph1.setLayout(new GridLayout(1, 1, 200, 200));
        ph2.setLayout(new GridLayout(1, 1, 200, 200));
        platzhalter1.add(ph1);
        platzhalter1.add(ph2);

        schnittpanel.add(schnitt);


        schnitt.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg1) {
                // TODO Auto-generated method stub

                SchnittkraftPunkt schnittkraft = new SchnittkraftPunkt();
                schnittkraft.main();

            }
        });

    }

    public void actionPerformed(ActionEvent e) {

        double q = 0.0;
        double l1 = 0.0;
        double l2 = 0.0;
        try {
            q = Double.parseDouble(jtf1.getText());
            //Double.parseDouble(((JTextField) e.getSource()).getText());



        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }

        try {

            l1 = Double.parseDouble(jtf2.getText());





        } catch (NumberFormatException eN) {
            ausgabeFeld2.setText("Ihre Eingabe war nicht korrekt");
        }


        try {

            l2 = Double.parseDouble(jtf3.getText());

            double bv = 0;
            double av = 0;
            bv = q * l1 / l2;
            av = q - bv;
//            Summe von V=0   => Av + Bv - q = 0

            ausgabeFeld1.setText("Summe von H=0   => Ah = 0");

            ausgabeFeld2.setText("<html>Summe von V=0   => Av + Bv - q = 0 <br> <TD> q - Bv = Av <TD>  " + q + " - " + bv + " = Av<TD> " + av + " = Av" + "</html>");

            ausgabeFeld3.setText("<html>Summe von M=0   => Bv * l2 - q * l1 = 0 | Umstellen nach Bv => -Bv; *(-1); :l2 <br> <TD> (q*l1)/l2 = Bv  |Zahlen einsetzen<br><TD>"
                    + "(" + q + "*" + l1 + ") / " + l2 + " = Bv |ausrechnen<br> " + bv + " = Bv</html>");



        } catch (NumberFormatException eN) {
            ausgabeFeld3.setText("Ihre Eingabe war nicht korrekt");
        }


    }

    public static void main() {

        JFrame frame = new JFrame();
        frame.pack();
        frame.setTitle("Punktbelastung");
        //frame.getContentPane().add(new Flaeche());
        frame.getContentPane().add(BorderLayout.NORTH, panel1);
        frame.getContentPane().add(BorderLayout.CENTER, panel2);
        frame.getContentPane().add(BorderLayout.SOUTH, panel3);
        frame.getContentPane().add(BorderLayout.EAST, schnittpanel);
        frame.getContentPane().add(BorderLayout.WEST, platzhalter1);


        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(650, 700);
        frame.setLocation(915, 100);
        frame.setResizable(true);
        frame.setVisible(true);
    }
}


SchnittkraftPunkt(SubClass von Punkt bzw. Flaeche)
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SchnittkraftPunkt extends JFrame implements ActionListener {

    JTextField jtf1 = new JTextField("Kraft F [KN/m]", 30);
    JTextField jtf2 = new JTextField("Länge l1 [m]", 30);
    JTextField jtf3 = new JTextField("Länge l2 [m]", 30);
    static JPanel panel1 = new JPanel();
    static JPanel panel2 = new JPanel();
    static JPanel panel3 = new JPanel();
    JLabel ausgabeFeld1 = new JLabel();
    JLabel ausgabeFeld2 = new JLabel();
    JLabel ausgabeFeld3 = new JLabel();
    static JPanel platzhalter1 = new JPanel();
    static JPanel platzhalter2 = new JPanel();
    JLabel ph1 = new JLabel();
    JLabel ph2 = new JLabel();
    Font f = new Font("Times New Roman", Font.PLAIN, 25);

    public SchnittkraftPunkt() {




        JLabel anzeige = new JLabel("<html><u>" + "Hier können Sie ihre Eingabe machen" + "</u></html>");
        anzeige.setFont(new Font("Times New Roman", Font.PLAIN, 25));



        jtf1.addActionListener(this);
        jtf2.addActionListener(this);
        jtf3.addActionListener(this);

        panel1.add(anzeige);
        //panel2.setLayout(new GridLayout(3, 1, 100, 100));
        panel2.setBounds(30, 30, 100, 100);
        jtf1.setPreferredSize(new Dimension(30, 30));
        jtf2.setPreferredSize(new Dimension(30, 30));
        jtf3.setPreferredSize(new Dimension(30, 30));
        panel2.add(jtf1);
        panel2.add(jtf2);
        panel2.add(jtf3);

        //
        panel3.setLayout(new GridLayout(3, 1, 10, 10));
        ausgabeFeld1.setPreferredSize(new Dimension(100, 100));
        ausgabeFeld2.setPreferredSize(new Dimension(100, 100));
        ausgabeFeld3.setPreferredSize(new Dimension(100, 100));
        panel3.add(ausgabeFeld1);
        panel3.add(ausgabeFeld2);
        panel3.add(ausgabeFeld3);



        ph1.setLayout(new GridLayout(1, 1, 200, 200));
        ph2.setLayout(new GridLayout(1, 1, 200, 200));
        platzhalter1.add(ph1);
        platzhalter2.add(ph2);


    }

    public void actionPerformed(ActionEvent e) {

        double q = 0.0;
        double l1 = 0.0;
        double l2 = 0.0;
        try {
            q = Double.parseDouble(jtf1.getText());
            //Double.parseDouble(((JTextField) e.getSource()).getText());



        } catch (NumberFormatException eN) {
            ausgabeFeld1.setText("Ihre Eingabe war nicht korrekt");
        }

        try {

            l1 = Double.parseDouble(jtf2.getText());

            double bv = 0;
            double av = 0;
            bv = q * l1 / l2;
            av = q - bv;

            ausgabeFeld1.setText("Summe von H=0   => Ah = 0");

            ausgabeFeld2.setText("<html>Summe von V=0   => Av + Bv - q = 0 <br> <TD> q - Bv = Av <TD>  " + q + " - " + bv + " = Av<TD> " + av + " = Av" + "</html>");

            ausgabeFeld3.setText("<html>Summe von M=0   => Bv * l2 - q * l1 = 0 | Umstellen nach Bv => -Bv; *(-1); :l2 <br> <TD> (q*l1)/l2 = Bv  |Zahlen einsetzen<br><TD>"
                    + "(" + q + "*" + l1 + ") / " + l2 + " = Bv |ausrechnen<br> " + bv + " = Bv</html>");







        } catch (NumberFormatException eN) {
            ausgabeFeld2.setText("Ihre Eingabe war nicht korrekt");
        }



    }

    public static void main() {


        SchnittkraftPunkt frame = new SchnittkraftPunkt();
        frame.pack();
        frame.setTitle("Schnittkraftberechnung bei Punktbelastung");
        frame.getContentPane().add(BorderLayout.NORTH, panel1);
        frame.getContentPane().add(BorderLayout.CENTER, panel2);
        frame.getContentPane().add(BorderLayout.SOUTH, panel3);
        frame.getContentPane().add(BorderLayout.EAST, platzhalter2);
        frame.getContentPane().add(BorderLayout.WEST, platzhalter1);


        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setSize(650, 700);
        frame.setLocation(915, 100);
        frame.setResizable(true);
        frame.setVisible(true);



    }
}

sry. für den vielen Text, aber ich glaube so versteht man den zusammenhang besser.

liebe Grüße Matthias
 
Zuletzt bearbeitet:
C

Camino

Gast
sry. für den vielen Text, aber ich glaube so versteht man den zusammenhang besser.
Hmm, eigentlich nicht so richtig. Du solltest nur eine einzige main-Methode in deinem Programm haben, ab welchem dein Programm startet. Dann würde ich nur einen einzigen JFrame anlegen, und die anderen Komponenten auf JPanel packen und die dann dort hineinlegen. Wenn es mehrere Panel geben sollte, zwischen denen du hin und her wechseln willst, kannst du mit einem CardLayout oder TabbedPane arbeiten.
 
C

Camino

Gast
Hallo Camino,

gut dass du es ansprichst.
Dass ich die main Methode so
Java:
public static void main(String[] args)
schreiben muss wusste ich, ABER da die Klasse Flaeche duch einen ActionListener von der Klassr Prog1 aufgerufen wird, geht das anscheinend nicht. Ich habe eigentlich alles versucht, zuerst habe ich in der Klasse Prog1 in der Methode ActionListener auch n.main(String[] args) eingegeben, dann dachte ich mir, "kann ja nicht sein", der verlangt doch ein übergabe Parameter, also habe ich den String "Punkt" zu testzwecken übergegeben, und ihn in der Klasse Flaeche als Titel benutzt, so dass ich dort frame.setTitle(args) schrieb. Es war wohl kein Fehler, denn compiliert hat er alles, doch was mich jetzt noch nervt, überall kann ich mit "setTitle" oder mit super("...") den Titel des Fensters angeben, doch in meinem letzten Fenster irgend wie nicht...seltsam.
Dann noch etwas seltsames, wenn ich das Fenster Flaeche duch einen klick auf den Button öffne, geht das Fenster normal auf, schließe ich es aber und mache es erneut auf dann kommen auf einmal alle Textfelder, Labels etc. doppelt und bei einem erneuten schließen und öffnen kommen wieder zweineue dazu. Ich dachte zuerst daran dass ich etwas zwei mal aufrufe, dann sah ich nochmal genau nach, habe aber nichts gefunden. Mitlerweile denke ich dass ich irgendwo noch etwas wie System.exit(0) und dispose() reinbringen muss, das habe ich aber nur in meinem Java buch gelesen, keine Ahnung ob ich das auch brauche.

Ah OK, so langsam komm ich dahinter, was du meinst. Ich würde aber die Methoden nicht unbedingt main() nennen, da es eben diese eine main-Methode zum Start des Programms gibt. Und dann würde ich die anderen Klassen nicht von JFrame sondern von JPanel ableiten und die dann in einen JFrame hineinpacken, der z.B. in der main-Methode erstellt wurde. Wie gesagt, du kannst zwischen mehreren Panels mit CardLayout oder TabbedPane wechseln. Die gewünschten Panels kannst du dann z.B. über eine Menüleiste oder über eine Toolbar aufrufen und anzeigen lassen.
 

Brayn

Mitglied
Ok, dann muss ich ja hinter dem Klassennamen, statt extend JFrame einfach extends JPanel schreiben und in der main Methode erstelle ich ein neues JFrame Objekt mit dem ich alle Panels Labels Buttons etc. draufpacke, oder?
Denn dass habe ich gerade mal gemacht, wenn ich aber in der MainClass (Prog1) nicht "n.main();" sondern "n.Flaeche();" schreibe sagt er es wäre ein Fehler Flaeche sei keine Methode, ok es ist ein Konstruktor, aber ein Konstruktor ist doch eine spezielle Art von Methode, also warum geht das dann nicht. Ich hoffe ich verwechsele da nichts.
 
C

Camino

Gast
Ich würde es etwa so machen:

Hauptprogramm:
Java:
import javax.swing.UIManager;

public class Prog1 {

	
	public Prog1() {

		new HauptFrame();
		
	}

	public static void main(String[] args) {
	     
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
		      public void run() {
		    	  new Prog1();
		      }
	    });

	}

}

Der HauptFrame:
Java:
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;


public class HauptFrame extends JFrame {

	private JPanel panel1, panel2, panel3; // usw.

	public HauptFrame() {

		init();

	}
	

	private void init() {

		setTitle( "Titel" );

		setSize(400, 300);
		
		// Frame auf dem Bildschirm zentrieren
		setLocationRelativeTo(getParent());
		
		// Panelobjekte erstellen
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel3 = new JPanel();

		// TabbedPane erstellen und Panel hinufügen
		JTabbedPane tabbedPane = new JTabbedPane(); 
		tabbedPane.addTab( "Panel 1", panel1 ); 
		tabbedPane.addTab( "Panel 2", panel2 );
		tabbedPane.addTab( "Panel 3", panel3 );

		// TabbedPane dem Frame ins BorderLayout legen (CENTER)
		add( BorderLayout.CENTER, tabbedPane );

		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
		setVisible( true );
	
	}
	
}

Und die einzelnen Panel (1-3, oder auch mehr) sind dann deine JPanel (Flaeche, Punkte...), die due als Klassen (abgeleitet von JPanel) anlegst und in der Frame-Klasse Objekte davon erstellst ( z.B. panel1 = new Flaeche(); ), welche in das TabbedPane gelegt werden. So etwa würde ich es machen. Ist halt ein bisschen einfach und ausbaufähig...
 
C

Camino

Gast
wenn ich aber in der MainClass (Prog1) nicht "n.main();" sondern "n.Flaeche();" schreibe sagt er es wäre ein Fehler Flaeche sei keine Methode, ok es ist ein Konstruktor, aber ein Konstruktor ist doch eine spezielle Art von Methode, also warum geht das dann nicht. Ich hoffe ich verwechsele da nichts.
Code:
n.Flaeche()
würde bedeuten, dass du vom Objekt n die Methode Flaeche() aufrufst. Wenn du ein neues Objekt erzeugen willst (also den Konstruktor aufrufst) machst du das mit
Code:
new
, also z.B.
Code:
Flaeche meineFlaeche = new Flaeche();
. Dieses Objekt meineFlaeche erzeugst du in der Frame-Klasse und fügst es dem TabbedPane hinzu.
Und auf deine Panels (in dem Fall z.B. Flaeche, was ja durch extends JPanel die Eigenschaften eines JPanels hat) fügst du die ganzen anderen Komponenten wie Buttons, Textfelder, Labels usw.
 
Zuletzt bearbeitet von einem Moderator:

Brayn

Mitglied
Das sieht echt spitze aus, super Idee. :)

Ich glaube nur dass ich damit noch etwas überfordert bin. Zudem habe ich zumindest mal den ansatz des ActionListeners verstanden.

Ich versuche mal meine Dateien inkl. gif Dateien hochzuladen, dann kannst du dir das ganze mal ansehen, ist glaube ich besser als nochmal den Code zu schicken.
Du kannst es ja einfach mal ausführen, bis jetzt funktioniert aber nur "System 1" zur weiter verlinkung

Die ganze Zeit habe ich es geschafft dass man die Fenster in der größe verändern kann und auch schließen kann. Für das fenster in der größe verändern zu können oder es zu verbieten muss man sich doch doch nur zwischen true und false bei "frame.setResizable(true"oder false");" entscheiden, (später möchte ich es sperren). Aber warum geht das jetzt nicht mehr? genauso wie das Fenster schließen.
 

Anhänge

  • Flaeche.java
    3,8 KB · Aufrufe: 5
  • Prog1.java
    3,1 KB · Aufrufe: 5
  • Punkt.java
    4,7 KB · Aufrufe: 5
  • Schnittbild.java
    1,2 KB · Aufrufe: 3
  • SchnittkraftPunkt.java
    9,6 KB · Aufrufe: 4

Brayn

Mitglied
Hier noch die zwei Bilder. Beim speichern bitte auf die ".gif" Endung achten.
 

Anhänge

  • SchnittePunktbelastung.jpg
    SchnittePunktbelastung.jpg
    40,9 KB · Aufrufe: 49
  • Systeme.gif
    Systeme.gif
    12,5 KB · Aufrufe: 43
Zuletzt bearbeitet:

Brayn

Mitglied
Das ist gerade komisch, ich habe gerade
Java:
//        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        frame.setResizable(false);
kommentiert und aufeinmal hat sich mein Problem von selbst gelöst. Wie kann dass sein???
Gerade jetzt dürfte ich das fenster doch garnicht schließen können, seltsam.
 
Zuletzt bearbeitet:
C

Camino

Gast
Die ganze Zeit habe ich es geschafft dass man die Fenster in der größe verändern kann und auch schließen kann. Für das fenster in der größe verändern zu können oder es zu verbieten muss man sich doch doch nur zwischen true und false bei "frame.setResizable(true"oder false");" entscheiden, (später möchte ich es sperren). Aber warum geht das jetzt nicht mehr? genauso wie das Fenster schließen.
Also ich kann das Fenster schliessen. Und bei Prog1 hast du
Code:
frame.setResizable(false)
stehen, weshalb sich die Grösse des Frames nicht mehr verändern lässt.

Aber irgendwie hab ich das Gefühl, dass du die Grundstruktur von Klassen und Programmen in Java noch nicht so richtig verstanden hast. Der Code ist auf jeden Fall ein ziemliches Durcheinander. Ich hatte dir ja Beispiele zusammengeschrieben, wie du erst mal klein anfangen kannst und dir ein Grundgerüst baust, welches du dann erweitern kannst. Du solltest nicht gleich alles auf einmal da reinbauen, wenn du noch nicht weisst wie, sonst hast du nur eine Menge an Fehlern und weisst nicht, was die bedeuten und wo die herkommen.

Willst du z.B. wirklich, dass immer wieder ein neuer Frame aufgeht, wenn du irgendwo raufklickst? Ich hatte dir ja schon geschrieben, dass es normalerweise so ist, dass man 1 Frame hat, in dem das Programm abläuft.

Du solltest mal aus deinen Klassen (Flaeche, Punkt...) die main()-Methode rausnehmen, bei der immer wieder ein neuer JFrame erzeugt wird, und dann versuchen, das Panel (z.B. Flaeche) so in dein Hauptframe zu bringen, wie ich das schon oben beschrieben hatte. Und in deiner Panel-Klasse musst du die Komponenten (Buttons, Labels, Textfelder) am besten mit einem LayoutManager anordnen.
 

Brayn

Mitglied
Du hast schon recht, ich habe nicht gerade den durchblick :-(
Ich habe zwar ein Sem. Software Entwicklung hinter mir, aber zum schluß konnte ich aus gesundheitlichen gründen nicht mehr mitmachen, weil ich aber soviel spaß am Programmieren habe, hab ich meine Sem.ferien mit Programmieren verbracht. Davon ab, Frames kamen auch noch garnicht vor, das habe ich mir alles selbst angeeignet, deshalb auch das durcheinander :)

Tatsächlich war es meine Absicht bei jedem klick ein Frame zu öffnen, aber du hast recht, es wird dann alles etwas viel :)
Heute wird wohl mein letzter freier Tag für die nächsten 6 Monate gewesen sein, mal sehen ob ich noch zum weiter machen komme.

Danke schön nochmal dass du mir so viel geholfen hast.

P.S.: Wenn ich wieder weiter mache benutze ich dein Ansatz.

liebe Grüße Matthias
 

Brayn

Mitglied
Ich habe noch damit angefangen :) und ich muss sagen das ist echt super.
Viel übersichtlicher, ich wusste z.B. garnicht dass man mehrer der gleichen Objekte in einer Zeile instanzieren kann, nur indem man ein Komma macht, echt genial. :)

Nun stoße ich aber auch schon an meine Grenzen. Oben hast du geschrieben dass ich nun, nur noch
Java:
panel1 = new Prog1alt();
schreiben muss, aber der sinn war doch dass, das was vorher auf dem Frame war, nun auf dem Panel sein soll oder? Ich habe auch Prog1alt nicht mehr von JFrame erben lassen sondern habe nun gewechselt auf JPanel, macht ja auch sinn :) aber trotzdem geht ein neues Fenster auf, muss ich noch etwas spezielles beachten?

Hier noch Prog1alt
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.ImageIcon;
import javax.swing.*;


public class Prog1alt extends JPanel{

    private JPanel background, panel1, buttonpanel ;

    public Prog1alt(){
       
        //Labels und Hintergrundbild erstellen
        JLabel bild = new JLabel(new ImageIcon("Systeme.gif"), SwingConstants.CENTER);
        JLabel frage = new JLabel("Wählen Sie eines der beiden Systeme aus");
        frage.setFont(new Font("Times New Roman", Font.PLAIN , 25));


        //Buttons festlegen
        JButton button1 = new JButton("System 1");
        button1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub

               Punkt n = new Punkt();
               //SchnittkraftPunkt schnittkraft = new SchnittkraftPunkt();
               n.main();



            }
        });


         JButton button2 = new JButton("System 2");
         button2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg1) {
                // TODO Auto-generated method stub

                Flaeche f = new Flaeche();
               // SchnittkraftPunkt schnittkraft = new SchnittkraftPunkt();
               f.main();

            }

        });

        //Labels und Buttons auf Panels befestigen
        background.add(bild);
        panel1.add(frage);
        buttonpanel.add(button1);
        buttonpanel.add(button2);

        buttonpanel.setLayout(new GridLayout(1, 2, 10, 10));
        button1.setPreferredSize(new Dimension(200, 20));
        button2.setPreferredSize(new Dimension(200, 20));


        //Sichtbarkeit festlegen
        JFrame frame = new JFrame();
        
        frame.setSize(900, 700);
        frame.setLocation(5, 30);
        frame.setResizable(false);
        frame.setVisible(true);

        frame.getContentPane().add(BorderLayout.EAST, buttonpanel);
        frame.add(BorderLayout.WEST, frage);
        frame.add(BorderLayout.SOUTH, bild);


    }


}

Wie du siehst habe ich auch die main Methode gelöscht und ich dachte die brauch ein Programm unbedingt :)

Gruß Matthias
 
C

Camino

Gast
Ich habe noch damit angefangen :) und ich muss sagen das ist echt super.
Viel übersichtlicher, ich wusste z.B. garnicht dass man mehrer der gleichen Objekte in einer Zeile instanzieren kann, nur indem man ein Komma macht, echt genial. :)
Ja, eine übersichtliche Struktur ist wichtig, besonders je grösser und umfangreicher dein Programm wird. Du könntest auch alles in eine Datei reinschreiben, aber übersichtlicher wird es, wenn du für jede Komponente deines Programmes eine eigene Klasse anlegst und Objekte erzeugst.

Nun stoße ich aber auch schon an meine Grenzen. Oben hast du geschrieben dass ich nun, nur noch
Java:
panel1 = new Prog1alt();
schreiben muss, aber der sinn war doch dass, das was vorher auf dem Frame war, nun auf dem Panel sein soll oder? Ich habe auch Prog1alt nicht mehr von JFrame erben lassen sondern habe nun gewechselt auf JPanel, macht ja auch sinn :) aber trotzdem geht ein neues Fenster auf, muss ich noch etwas spezielles beachten?
Na ja, kommt halt drauf an, was dein Prog1alt sein soll. Weiter unten in Prog1alt erzeugst du ja doch noch einen Frame, der dann auch sichtbar wird. Wie gesagt, du brauchst erstmal 1 main-Methode (zum Starten des Programmes), 1 JFrame (in den dann deine Panels gebracht werden können). Dann kannst du ja erst mal langsam anfangen, deine Komponenten in dem Frame zu platzieren.
Zum Beispiel einen Button in den NORTH-Bereich (BorderLayout) und ein Panel mit Eingabe-Textfeldern und Ausgabe-Labeln im CENTER vom BorderLayout. Und dann baust du dir einen ActionListener, der die eingegebenen Werte aus den Textfeldern berechnet und in den Labeln ausgibt. Vielleicht siehst du dann deutlicher, wie die Struktur ist und wie du sie erweitern kannst.

Ich hab am Anfang auch erst ne Weile gebraucht, bis ich das Prinzip verstanden hatte. Aber auch heute gehe ich noch so vor, wenn ich mir eine grafische Anwendung in Swing erstellen möchte, dass ich mir erst mal ein Grundgerüst erstelle: 1 Starterklasse (main), 1 Hauptframe (mit Menü, Toolbar, MainPanel, Statuszeile). In meinem MainPanel erstelle ich dann mit einem CardLayout oder einem TabbedPane die Möglichkeit, zwischen meinen Panels, die ich anzeigen möchte, hin und her zu schalten.

Wie du siehst habe ich auch die main Methode gelöscht und ich dachte die brauch ein Programm unbedingt
Ja, es muss auch 1 main-Methode geben, mit der das gesamte Programm dann gestartet wird. Ich meinte auch eher die anderen main()-Methoden, die du in den Panel-Klassen drin hattest. Entweder hast du eine eigene Klasse, so eine Art Starterklasse, in der die main-Methode drin ist und die dann den Hauptframe aufruft (so wie ich das oben geschrieben hatte), oder du kannst auch die main-Methode in die Hauptframe-Klasse stecken, so wie du das gemacht hattest.
Aber die anderen Panel erzeugst du dann nicht über die main-Methode, welche du vorher dort stehen hattest, sondern mit
Code:
new Panel-Name
. Und diese Panelobjekte erzeugst du dann auch in der Hauptframe-Klasse, damit hast du die Panelobjekte auch dort und kannst sie in den Frame einfügen.

Du musst dir halt auch grundsätzlich die Struktur deines Programms überlegen. Am besten ist es, sich für jede unterschiedliche Darstellung eine Panelklasse zu erstellen und die dann im Frame auszutauschen, wenn sie gebraucht werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JavaFX Nur Zahlen in Textfield AWT, Swing, JavaFX & SWT 4
Juelin Eingabensteuerung mit Textfield AWT, Swing, JavaFX & SWT 20
J Eingaben aus Textfield & ComboBox speichern und in ComboBox wieder ausgeben AWT, Swing, JavaFX & SWT 3
K JavaFX Taschenrechner textField auf 10stellen begrenzen AWT, Swing, JavaFX & SWT 26
Z textField.getText = null AWT, Swing, JavaFX & SWT 15
officialmaxl JavaFX Textfield getTextfield() in String speichern AWT, Swing, JavaFX & SWT 1
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
B JavaFX ListView in Kombination mit TextField AWT, Swing, JavaFX & SWT 5
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
F JavaFX textField Ausgabe automatisch kopieren AWT, Swing, JavaFX & SWT 7
M JavaFX String aus TextField reagiert nicht wie erwartet AWT, Swing, JavaFX & SWT 3
S JavaFX TextField auf Datentyp prüfen AWT, Swing, JavaFX & SWT 1
M JavaFX .setCellFactory () mit TextField AWT, Swing, JavaFX & SWT 4
L TextField Listener AWT, Swing, JavaFX & SWT 13
L TextField Eingabe in andere GUI übernehmen AWT, Swing, JavaFX & SWT 1
C JavaFX mit .setText() befülltes Textfield liefert anschließend mit .getText() den ursprünglichen Wert? AWT, Swing, JavaFX & SWT 1
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
S Buttons und TextField automatisch vergrößern AWT, Swing, JavaFX & SWT 8
Y Listview Textfield vergrößern, Schrift anpassen AWT, Swing, JavaFX & SWT 0
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
I JavaFX TextField auf Eingabe prüfen AWT, Swing, JavaFX & SWT 3
D Textfield bei starten füllen. AWT, Swing, JavaFX & SWT 5
H Textfield bleibt im Hintergrund AWT, Swing, JavaFX & SWT 2
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
U Swing NullPointerException trotz Referenz auf Textfield & Button AWT, Swing, JavaFX & SWT 6
S LayoutManager TextField verschwindet / wird klein AWT, Swing, JavaFX & SWT 4
S Button in Textfield ziehen AWT, Swing, JavaFX & SWT 4
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
G JavaFX TextField Eingabe formatieren/einschränken AWT, Swing, JavaFX & SWT 2
C Integer in ein Textfield schreiben. AWT, Swing, JavaFX & SWT 4
P TextField beim klicken von JButton speichern AWT, Swing, JavaFX & SWT 17
C Swing TextField auslesen AWT, Swing, JavaFX & SWT 21
MiMa Integer Zahl in Textfield ausgeben AWT, Swing, JavaFX & SWT 12
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
B JComboBox ans Textfield gelangen AWT, Swing, JavaFX & SWT 4
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
R Textfield auslesen auf Anforderung AWT, Swing, JavaFX & SWT 4
A Button und Textfield AWT, Swing, JavaFX & SWT 4
A TextField und Label AWT, Swing, JavaFX & SWT 8
H gui textfield AWT, Swing, JavaFX & SWT 5
A TextField: Textfeld teilweise editierbar AWT, Swing, JavaFX & SWT 2
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
E Button in TextField eibetten? AWT, Swing, JavaFX & SWT 4
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
W textfield zentriert AWT, Swing, JavaFX & SWT 2
N Swing Textfield listener AWT, Swing, JavaFX & SWT 2
H Zeich in einem TextField farblich markieren?! AWT, Swing, JavaFX & SWT 5
D Swing [BoxLayout] Nur TextArea und nicht TextField vergroessen AWT, Swing, JavaFX & SWT 2
D Textfield auswerten AWT, Swing, JavaFX & SWT 4
M Swing InputVerifer auf TextField AWT, Swing, JavaFX & SWT 14
B setText() auf TextField mit Document AWT, Swing, JavaFX & SWT 2
G Problem mit Textfield AWT, Swing, JavaFX & SWT 2
G Den Inhalt von einem Textfield aktualisieren AWT, Swing, JavaFX & SWT 6
D Inhalt von Textfield nach ComboBox AWT, Swing, JavaFX & SWT 2
E Swing Button ActionListener Infos aus Textfield und ComboBox AWT, Swing, JavaFX & SWT 3
G TextField im Hintergrund AWT, Swing, JavaFX & SWT 2
Z TextField aus ActionListener von JButton verändern AWT, Swing, JavaFX & SWT 10
O ComboBox hinter TextField? AWT, Swing, JavaFX & SWT 8
T Checkbox & Textfield AWT, Swing, JavaFX & SWT 5
M Beschränkung auf Nur-Zahleneingabe in Textfield klappt nicht AWT, Swing, JavaFX & SWT 3
N Textfield feste größe? AWT, Swing, JavaFX & SWT 1
M Datum Textfield AWT, Swing, JavaFX & SWT 6
S TextField fehler AWT, Swing, JavaFX & SWT 3
D Problem mit TextField AWT, Swing, JavaFX & SWT 22
C Textfield Background auf Standard zurücksetzen AWT, Swing, JavaFX & SWT 2
V keyListener soll textfield adden AWT, Swing, JavaFX & SWT 2
R TextField bringt NullPointerException bei setVisible() AWT, Swing, JavaFX & SWT 12
J JComboBox Eintrag soll TextField aktualisieren AWT, Swing, JavaFX & SWT 3
P Komponentenentwicklung mit TextField und Label AWT, Swing, JavaFX & SWT 10
K Problem mit TextField Strings AWT, Swing, JavaFX & SWT 2
S Textfield nummer merken AWT, Swing, JavaFX & SWT 3
M problem mit textfield-aktualisierung AWT, Swing, JavaFX & SWT 4
S Fehler beim Auslesen des Textes im textfield AWT, Swing, JavaFX & SWT 8
G Zugriff auf TextField geht nicht AWT, Swing, JavaFX & SWT 5
V Werte aus TextField in eine andere Klasse? AWT, Swing, JavaFX & SWT 2
M Textfield AWT, Swing, JavaFX & SWT 8
S "größeres Problem" mit JComboBox und Textfield AWT, Swing, JavaFX & SWT 35
P [TextField] cursor setzten AWT, Swing, JavaFX & SWT 2
S Eingabe einschränken bei TextField AWT, Swing, JavaFX & SWT 19
S AWT: Probleme mit TextField AWT, Swing, JavaFX & SWT 4
S TextField: Zeilenumbrüche AWT, Swing, JavaFX & SWT 3
E Zeilenumbruch in einem AWT TextField AWT, Swing, JavaFX & SWT 2
F requestFocus() auf ein TextField AWT, Swing, JavaFX & SWT 6
E ausgelesener String wird in Textfield nicht angezeigt AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben