Compiler-Fehler Schuhkalkulator

R

randomguest6543

Gast
irgendwie funzt es nicht richtig, gibt mir aber keine fehlermeldung. Programm hat schonal geklappt, hab wohl irgendwas geändert, dass es nu nicht mehr läuft, aber ich find den fehler einfach nicht^^
hier mal des Programm:

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.*;
import java.awt.*;

import java.text.*;
import java.util.*;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.event.*;
import javax.swing.*;


public class Schuhkalkulator extends JFrame implements Runnable{

       SimpleDateFormat  sdf, sdf1;
       JMenu             jm_uhr;

       private int anzeige = 0;
       private JProgressBar jpb_prozent;
       private JTextField   jtf_fusslaengecm1;
       private JTextField   jtf_schuhgroesse1;
       private JTextField   jtf_schuhgroesse2;
       private JTextField   jtf_fusslaengecm2;
       private JTextArea    jta_filler1;
       private JTextArea    jta_filler2;

       Schuhkalkulator(String title) {

             JLabel            jl_ueberschrift  = new JLabel("Schuhkalkulator");
                               jl_ueberschrift.setFont(new Font("Sans_Serif", Font.BOLD, 16));
             JLabel            jl_text1 = new JLabel("Fußlänge in Centimeter: ");
             JLabel            jl_text2 = new JLabel("Schuhgröße: ");
             JLabel            jl_text3 = new JLabel("Schuhgröße: ");
             JLabel            jl_text4 = new JLabel("Fußlänge in Centimeter: ");

             JButton           jb_berechne1     = new JButton("                       Berechne 1                      ");
                               jb_berechne1.addActionListener(new Lauscher());
             JButton           jb_berechne2     = new JButton("                       Berechne 2                      ");
                               jb_berechne2.addActionListener(new Lauscher());
             JButton           jb_clear         = new JButton("                        Neustart                        ");
                               jb_clear.addActionListener(new Lauscher());

                               jtf_schuhgroesse1= new JTextField(13);
                               jtf_schuhgroesse2= new JTextField(13);
                               jtf_fusslaengecm1= new JTextField(8);
                               jtf_fusslaengecm2= new JTextField(8);

                               jta_filler1      = new JTextArea(2,22);
                               jta_filler1.setBackground(Color.black);
                               jta_filler2      = new JTextArea(2,22);
                               jta_filler2.setBackground(Color.black);

                               jpb_prozent      = new JProgressBar(0,100);
                               jpb_prozent.setValue(anzeige);

                               sdf              = new SimpleDateFormat("dd.MM.yyyy");
                               sdf1             = new SimpleDateFormat("HH:mm:ss");

             JMenu             jm_datei         = new JMenu("Datei");
                               jm_uhr           = new JMenu();

             JMenuItem         jmi_beenden      = new JMenuItem(" Ende ");
                               jmi_beenden.addActionListener(new Lauscher());
                               jm_datei.add(jmi_beenden);

             JMenuBar          jmb_time         = new JMenuBar();
                               jmb_time.setLayout(new BorderLayout());
                               jmb_time.add(jm_datei, BorderLayout.WEST);
                               jmb_time.add(jm_uhr, BorderLayout.EAST);

             setJMenuBar       (jmb_time);
             //***************************************
             JPanel left = new JPanel();
             left.setLayout(new FlowLayout());

             JPanel top = new JPanel();
             top.setLayout(new FlowLayout());
             top.add(jl_ueberschrift);

             JPanel right = new JPanel();
             right.setLayout(new FlowLayout());
             
             JPanel bottom = new JPanel();
             bottom.setLayout(new BorderLayout());
             bottom.add(jpb_prozent, BorderLayout.NORTH);
             bottom.add(jb_clear, BorderLayout.SOUTH);


             JPanel middle = new JPanel();
             middle.setPreferredSize(new Dimension(300, 400));
             middle.add(jl_text1);
             middle.add(jtf_fusslaengecm1);
             middle.add(jl_text2);
             middle.add(jtf_schuhgroesse1);
             middle.add(jb_berechne1);
             middle.add(jta_filler1);
             //***************************************
             middle.add(jl_text3);
             middle.add(jtf_schuhgroesse2);
             middle.add(jl_text4);
             middle.add(jtf_fusslaengecm2);
             middle.add(jb_berechne2);
             middle.add(jta_filler2);


             //***************************************

             
             
             
             
             Container cp = getContentPane();
             cp.setLayout(new BorderLayout());
             cp.add(top, BorderLayout.NORTH);
             cp.add(left, BorderLayout.WEST);
             cp.add(right, BorderLayout.EAST);
             cp.add(middle, BorderLayout.CENTER);
             cp.add(bottom, BorderLayout.SOUTH);
       }

       public void run() {

              while(true) {
                     Date zeit = new Date();
                     jm_uhr.setText("Datum: "+sdf.format(zeit)+"    Uhrzeit: "+sdf1.format(zeit));
                     try {
                         Thread.sleep(1000);
                     }
                     catch(InterruptedException e) {}
              }
       }

       class Lauscher implements ActionListener {
             public void actionPerformed(ActionEvent e) {
                    String button = e.getActionCommand();
                    if(button.equals("                    Berechne 1                   ")) {
                               anzeige = anzeige+50;
                               jpb_prozent.setValue(anzeige);
                               double fusslaenge1 = Double.parseDouble(jtf_fusslaengecm1.getText());
                               double schuhgroesse1       = fusslaenge1*11/7;
                               jtf_schuhgroesse1.setText("" + schuhgroesse1);
                    }
                    //*******************************
                    if(button.equals("                    Berechne 2                   ")) {
                               anzeige = anzeige+50;
                               jpb_prozent.setValue(anzeige);
                               double schuhgroesse2 = Double.parseDouble(jtf_schuhgroesse2.getText());
                               double fusslaenge2     = schuhgroesse2*7/11;
                               jtf_fusslaengecm2.setText("" + fusslaenge2);
                    }
                    //*******************************
                    if(button.equals(" Ende ")) {
                               setVisible(false);
                               setDefaultCloseOperation(EXIT_ON_CLOSE);
                    }
                    //*******************************
                    if(button.equals("                    Neustart                    ")) {
                               jtf_fusslaengecm1.setText("");
                               jtf_fusslaengecm2.setText("");
                               jtf_schuhgroesse1.setText("");
                               jtf_schuhgroesse2.setText("");
                               anzeige = 0;
                               jpb_prozent.setValue(anzeige);
                    }
             }

       }

    public static void main(String[] args) {
               Schuhkalkulator  fenster = new Schuhkalkulator(" Schuhgrößenkalkulator v. 1.0 ");
                                fenster.setSize(270,400);
                                fenster.setLocation(200,300);
                                fenster.setVisible(true);
                                fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                Thread uhr = new Thread(fenster);
                                uhr.start();
    }
}
vielen Dank schonmal :)
 
Zuletzt bearbeitet von einem Moderator:
R

randomguest6548

Gast
Die Buttons funktionieren nicht mehr, obwohl die schonmal einwandfrei liefen. Hab eig nicht relevvantes geändert...
 

Landei

Top Contributor
Du hast die Strings geändert, sie stimmen bei den JButtons und beim Listener nicht überein. Prinzipiell sollte man jeden etwas komplizierteren String als "Konstante" definieren:
Java:
public class Schuhkalkulator extends JFrame implements Runnable {

    private static final String BERECHNE_1 = "                       Berechne 1                      ";
    private static final String BERECHNE_2 = "                       Berechne 2                      ";
    private static final String NEUSTART = "                        Neustart                        ";

...

        JButton jb_berechne1 = new JButton(BERECHNE_1);
        jb_berechne1.addActionListener(new Lauscher());
        JButton jb_berechne2 = new JButton(BERECHNE_2);
        jb_berechne2.addActionListener(new Lauscher());
        JButton jb_clear = new JButton(NEUSTART);
        jb_clear.addActionListener(new Lauscher());

...

    class Lauscher implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String button = e.getActionCommand();
            if (button.equals(BERECHNE_1)) {
                anzeige = anzeige + 50;
                jpb_prozent.setValue(anzeige);
                double fusslaenge1 = Double.parseDouble(jtf_fusslaengecm1.getText());
                double schuhgroesse1 = fusslaenge1 * 11 / 7;
                jtf_schuhgroesse1.setText("" + schuhgroesse1);
            }
            //*******************************
            if (button.equals(BERECHNE_2)) {
                anzeige = anzeige + 50;
                jpb_prozent.setValue(anzeige);
                double schuhgroesse2 = Double.parseDouble(jtf_schuhgroesse2.getText());
                double fusslaenge2 = schuhgroesse2 * 7 / 11;
                jtf_fusslaengecm2.setText("" + fusslaenge2);
            }
            //*******************************
            if (button.equals(" Ende ")) {
                setVisible(false);
                setDefaultCloseOperation(EXIT_ON_CLOSE);
            }
            //*******************************
            if (button.equals(NEUSTART)) {
                jtf_fusslaengecm1.setText("");
                jtf_fusslaengecm2.setText("");
                jtf_schuhgroesse1.setText("");
                jtf_schuhgroesse2.setText("");
                anzeige = 0;
                jpb_prozent.setValue(anzeige);
            }
        }
    }
...

Ansonsten sehe ich noch jede Menge Grausamkeiten. Das Fenster solltest du nicht Runnable machen, nur um die Uhr laufen zu lassen (wie sinnvoll eine Uhr ist, wo jedes OS irgendwo eine anzeigt, sei einmal dahingestellt). Die bessere Lösung ist, eine separate Uhr-Klasse zu schreiben, die dein Fenster ändert. Deine Methoden sind viel zu lang. Statt einer einzigen ActionListener-Klasse, die erst mal rausfinden muss, wo geklickt wurde, verwende lieber für jeden Button eine eigene (am besten als anonyme Klasse), oder auch Actions. Die Buttons mit Leerzeichen zu verbreitern ist zwar sehr kreativ, aber bestimmt nicht im Sinne des Erfinders. Dein Einrückungsstil ist ziemlich gewöhnungsbedürftig.
 
G

Gelöschtes Mitglied 23978

Gast
Die Buttons funktionieren nicht mehr, obwohl die schonmal einwandfrei liefen. Hab eig nicht relevvantes geändert...

Du hast scheinbar etwas entscheidendes geändert. Entweder die Leerzeichen in deinem Buttonnamen oder die Leerzeichen bei deiner Abfrage.

Versuch es mal mit folgendem (am besten kopieren, damit die Leerzeichen passen):
Java:
if (button.equals("                       Berechne 1                      "))


Das alles ändert nichts daran das du die Bennenung deiner Buttons mal überdenken solltets.
 

Kruemel

Mitglied
Wenn man im ActionListener

Java:
Object btn = e.getSource();

if(btn = jb_berechne1)
 //...

macht, passiert das nicht.

Gruß, Kruemel
 

Landei

Top Contributor
Hier die Version, wie ich sie schreiben würde:

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

import java.text.*;
import java.util.*;

import javax.swing.*;

public class Schuhkalkulator {

    private static final SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
    private static final SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
    private int anzeige = 0;
    private JProgressBar jpb_prozent = new JProgressBar(0, 100);
    private JTextField jtf_fusslaengecm1 = new JTextField(13);
    private JTextField jtf_schuhgroesse1 = new JTextField(13);
    private JTextField jtf_schuhgroesse2 = new JTextField(8);
    private JTextField jtf_fusslaengecm2 = new JTextField(8);
    private JTextArea jta_filler1 = new JTextArea(2, 22);
    private JTextArea jta_filler2 = new JTextArea(2, 22);
    private JMenu jm_uhr = new JMenu();
    private Action berechne1Action = new AbstractAction("Berechne 1") {

        public void actionPerformed(ActionEvent e) {
            calculate(jtf_fusslaengecm1, jtf_schuhgroesse1, 11.0 / 7.0);
        }
    };
    private Action berechne2Action = new AbstractAction("Berechne 2") {

        public void actionPerformed(ActionEvent e) {
            calculate(jtf_schuhgroesse2, jtf_fusslaengecm2, 7.0 / 11.0);
        }
    };
    private Action endeAction = new AbstractAction("Ende") {

        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    };
    private Action neustartAction = new AbstractAction("Neustart") {

        public void actionPerformed(ActionEvent e) {
            jtf_fusslaengecm1.setText("");
            jtf_fusslaengecm2.setText("");
            jtf_schuhgroesse1.setText("");
            jtf_schuhgroesse2.setText("");
            anzeige = 0;
            jpb_prozent.setValue(anzeige);
        }
    };

    public Schuhkalkulator() {
        initJFrame(getTop(), getMiddle(), getBottom());
        initTimer();
    }

    private JComponent getTop() {
        JPanel top = new JPanel(new FlowLayout());
        JLabel jl_ueberschrift = new JLabel("Schuhkalkulator");
        jl_ueberschrift.setFont(new Font("Sans_Serif", Font.BOLD, 16));
        top.add(jl_ueberschrift);
        return top;
    }

    private JComponent getMiddle() {
        JPanel middle = new JPanel(new FlowLayout());
        Box box = Box.createVerticalBox();
        fillSection(box, "Fußlänge in Centimeter: ", jtf_fusslaengecm1,
                "Schuhgröße: ", jtf_schuhgroesse1,
                berechne1Action, jta_filler1);
        fillSection(box, "Schuhgröße: ", jtf_schuhgroesse2,
                "Fußlänge in Centimeter: ", jtf_fusslaengecm2,
                berechne2Action, jta_filler2);
        box.add(Box.createHorizontalGlue());
        middle.add(box);
        return middle;
    }

    private void fillSection(Box box, String labelText1, JTextField textField1,
            String labelText2, JTextField textField2, Action action, JTextArea filler) {
        box.add(new JLabel(labelText1));
        box.add(textField1);
        box.add(new JLabel(labelText2));
        textField2.setEditable(false);
        box.add(textField2);
        JButton button = new JButton(action);
        button.setMaximumSize(new Dimension(1000, 30));
        box.add(button);
        filler.setBackground(Color.black);
        box.add(jta_filler1);
    }

    private JComponent getBottom() {
        JPanel bottom = new JPanel(new BorderLayout());
        bottom.add(jpb_prozent, BorderLayout.NORTH);
        JButton jb_clear = new JButton(neustartAction);
        bottom.add(jb_clear, BorderLayout.SOUTH);
        return bottom;
    }

    private void initJFrame(JComponent north, JComponent center, JComponent south) {
        JFrame jFrame = new JFrame(" Schuhgrößenkalkulator v. 1.0 ");
        jFrame.setSize(270, 400);
        jFrame.setLocation(200, 300);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initMenu(jFrame);

        jFrame.getContentPane().add(north, BorderLayout.NORTH);
        jFrame.getContentPane().add(center, BorderLayout.CENTER);
        jFrame.getContentPane().add(south, BorderLayout.SOUTH);

        jFrame.setVisible(true);
    }

    private void initMenu(JFrame jFrame) {
        JMenu jm_datei = new JMenu("Datei");

        JMenuItem jmi_beenden = new JMenuItem(endeAction);
        jm_datei.add(jmi_beenden);

        JMenuBar jmb_time = new JMenuBar();
        jmb_time.setLayout(new BorderLayout());
        jmb_time.add(jm_datei, BorderLayout.WEST);
        jmb_time.add(jm_uhr, BorderLayout.EAST);

        jFrame.setJMenuBar(jmb_time);
    }

    private void initTimer() {
        javax.swing.Timer uhr = new javax.swing.Timer(1000, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                Date time = new Date();
                jm_uhr.setText("Datum: " + sdf.format(time) + " Uhrzeit: " + sdf1.format(time));
            }
        });
        uhr.setInitialDelay(0);
        uhr.start();
    }

    private void calculate(JTextField source, JTextField target, double factor) {
        try {
            erhoeheAnzeige(50);
            double sourceValue = Double.parseDouble(source.getText());
            double targetValue = sourceValue * factor;
            target.setText("" + targetValue);
        } catch (NumberFormatException ex) {
        }
    }

    private void erhoeheAnzeige(int n) {
        anzeige += n;
        jpb_prozent.setValue(anzeige);
    }

    public static void main(String[] args) {
        new Schuhkalkulator();
    }
}

Wesentliche Änderungen:
- Komposition statt Vererbung für JFrame, Runnable
- Aufteilen großer Methoden nach Funktionalität - SRP (Single Responsibility Principle)
- DRY (don't repeat yourself), z.B. calculate und fillSection
- Nutzung von Actions statt ActionListener
- javax.swing.Timer statt Thread, Komposition durch anonyme Klasse
- Änderungen am Layout (z.B. Verwendung von Box, Steuerung der Buttonbreite über setMaximumSize)
- Entscheidung für genau einen Ort zur Initialisierung: entweder main oder Konstruktor (hier letzteres)
 

Oben