# Java-Bußgeldrechner



## leon_krys (29. Aug 2018)

Guten Tag,
ich habe das Problem, dass ich eine Hausaufgabe aufbekommen habe in wenigen Wochen einen voll funktionierenden Bußgeldrechner mit dem Java-Editor zu programmieren. Dieser soll beinhalten, ob Außerorts/Innerorts/Autobahn gefahren wurde (was ich durch einen Button steuern möchte), wie viel Strafpunkte derjenige erhält, wie viel Bußgeld er bezahlen muss und ob er ein Fahrverbot erhält. 
Die Oberfläche habe ich dazu breits fertiggestellt. Ich finde aber keinen Ansatz, wie ich meine Idee nun umsetze und was ich genau überhaupt machen muss.

Danke schonmal im vorraus.
LG
Leon K.


----------



## httpdigest (29. Aug 2018)

leon_krys hat gesagt.:


> Ich finde aber keinen Ansatz, wie ich meine Idee nun umsetze *und was ich genau überhaupt machen muss*.


(für den fett hervorgehobenen Teil): Das kann dir hier sicherlich auch niemand sagen. Dafür solltest du mal den Aufgabensteller fragen.


----------



## Javinner (29. Aug 2018)

leon_krys hat gesagt.:


> Die Oberfläche habe ich dazu breits fertiggestellt


Zeig mal, eventuell klärt es sich ganz schnell.


----------



## leon_krys (30. Aug 2018)

Ich denke ich habe eine gute, aber sehr umfangreiche Lösung gefunden. Wenn wer eine kürzere hat, bitte melden.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
 *
 * Beschreibung
 *
 * @version 1.0 vom 29.08.2018
 * @author
 */

public class version2 extends JFrame {
  // Anfang Attribute
  private JLabel jLabel1 = new JLabel();
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  private JButton jButton3 = new JButton();
  private JLabel jLabel2 = new JLabel();
  private JLabel jLabel3 = new JLabel();
  private JNumberField jNumberField1 = new JNumberField();
  private JNumberField jNumberField2 = new JNumberField();
  private JLabel jLabel4 = new JLabel();
  private JLabel jLabel5 = new JLabel();
  private JLabel jLabel6 = new JLabel();
  private JNumberField jNumberField3 = new JNumberField();
  private JNumberField jNumberField4 = new JNumberField();
  private JNumberField jNumberField5 = new JNumberField();
  // Ende Attribute
 
  public version2() {
    // Frame-Initialisierung
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 641;
    int frameHeight = 548;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setTitle("version1");
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
   
    jLabel1.setBounds(160, 8, 305, 49);
    jLabel1.setText("Bußgeldrechner");
    jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
    jLabel1.setFont(new Font("Lucida Bright", Font.BOLD, 20));
    jLabel1.setForeground(new Color(0xFFC800));
    jLabel1.setBackground(new Color(0x404040));
    jLabel1.setOpaque(true);
    cp.add(jLabel1);
    cp.setBackground(new Color(0xFFAFAF));
    jButton1.setBounds(24, 160, 161, 41);
    jButton1.setText("Innerorts");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    jButton1.setBackground(Color.RED);
    jButton1.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jButton1);
    jButton2.setBounds(216, 160, 177, 41);
    jButton2.setText("Außerorts");
    jButton2.setMargin(new Insets(2, 2, 2, 2));
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton2_ActionPerformed(evt);
      }
    });
    jButton2.setBackground(Color.YELLOW);
    cp.add(jButton2);
    jButton3.setBounds(424, 160, 177, 41);
    jButton3.setText("Autobahn");
    jButton3.setMargin(new Insets(2, 2, 2, 2));
    jButton3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton3_ActionPerformed(evt);
      }
    });
    jButton3.setBackground(Color.GREEN);
    cp.add(jButton3);
    jLabel2.setBounds(32, 72, 174, 36);
    jLabel2.setText("Zugelassene Geschwindigkeit");
    jLabel2.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel2.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jLabel2);
    jLabel3.setBounds(408, 72, 185, 33);
    jLabel3.setText("Gefahrene Geschwindigkeit");
    jLabel3.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel3.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jLabel3);
    jNumberField1.setBounds(24, 120, 185, 25);
    jNumberField1.setText("");
    cp.add(jNumberField1);
    jNumberField2.setBounds(400, 120, 201, 25);
    jNumberField2.setText("");
    cp.add(jNumberField2);
    jLabel4.setBounds(224, 216, 161, 25);
    jLabel4.setText("Strafpunkte");
    jLabel4.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel4.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jLabel4);
    jLabel5.setBounds(224, 304, 161, 25);
    jLabel5.setText("Bußgeld");
    jLabel5.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel5.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jLabel5);
    jLabel6.setBounds(224, 392, 161, 25);
    jLabel6.setText("Fahrverbot?");
    jLabel6.setHorizontalAlignment(SwingConstants.CENTER);
    jLabel6.setHorizontalTextPosition(SwingConstants.CENTER);
    cp.add(jLabel6);
    jNumberField3.setBounds(224, 248, 161, 33);
    jNumberField3.setText("");
    cp.add(jNumberField3);
    jNumberField4.setBounds(224, 336, 161, 33);
    jNumberField4.setText("");
    cp.add(jNumberField4);
    jNumberField5.setBounds(224, 424, 161, 33);
    jNumberField5.setText("");
    cp.add(jNumberField5);
    // Ende Komponenten
   
    setVisible(true);
  } // end of public version2
 
  // Anfang Methoden
 
  public static void main(String[] args) {
    new version2();
  } // end of main
 
  public void jButton1_ActionPerformed(ActionEvent evt)
  { int vg, vz, v;
    vg=jNumberField2.getInt();
    vz=jNumberField1.getInt();
    v=vg-vz;
   
    if (vg<=vz)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("0");
      jNumberField5.setText("Nein");
    } // end of if
   
    if (v==10)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("10€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=15)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("25€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if(v<=20)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("35€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=25)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("80€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=30)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("100€");
      jNumberField5.setText("1 Monat*");
    } // end of if
   
    else if (v<=40)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("160€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=50)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("200€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=60)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("280€");
      jNumberField5.setText("2 Monat");
    } // end of if
   
    else if (v<=70)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("480€");
      jNumberField5.setText("3 Monat");
    } // end of if
   
    else
    {
      jNumberField3.setText("2");
      jNumberField4.setText("680€");
      jNumberField5.setText("3 Monat");
    } // end of if
  } // end of jButton1_Innerorts
 
 
  public void jButton2_ActionPerformed(ActionEvent evt)
  { int vg, vz, v;
    vg=jNumberField2.getInt();
    vz=jNumberField1.getInt();
    v=vg-vz;
   
    if (vg<=vz)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("0");
      jNumberField5.setText("Nein");
    } // end of if
   
    if (v==10)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("10€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=15)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("20€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if(v<=20)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("30€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=25)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("70€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=30)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("80€");
      jNumberField5.setText("1 Monat*");
    } // end of if
   
    else if (v<=40)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("120€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=50)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("160€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=60)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("240€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=70)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("440€");
      jNumberField5.setText("2 Monat");
    } // end of if
   
    else
    {
      jNumberField3.setText("2");
      jNumberField4.setText("600€");
      jNumberField5.setText("3 Monat");
    } // end of if 
  } // end of jButton2_Außerorts
 
 
  public void jButton3_ActionPerformed(ActionEvent evt)
  {
    int vg, vz, v;
    vg=jNumberField2.getInt();
    vz=jNumberField1.getInt();
    v=vg-vz;
   
    if (vg<=vz)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("0");
      jNumberField5.setText("Nein");
    } // end of if
   
    if (v==10)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("10€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=15)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("20€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if(v<=20)
    {
      jNumberField3.setText("0");
      jNumberField4.setText("30€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=25)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("70€");
      jNumberField5.setText("Nein");
    } // end of if
   
    else if (v<=30)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("80€");
      jNumberField5.setText("1 Monat*");
    } // end of if
   
    else if (v<=40)
    {
      jNumberField3.setText("1");
      jNumberField4.setText("120€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=50)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("160€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=60)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("240€");
      jNumberField5.setText("1 Monat");
    } // end of if
   
    else if (v<=70)
    {
      jNumberField3.setText("2");
      jNumberField4.setText("440€");
      jNumberField5.setText("2 Monat");
    } // end of if
   
    else
    {
      jNumberField3.setText("2");
      jNumberField4.setText("600€");
      jNumberField5.setText("3 Monat");
    } // end of if 
   
  } // end of jButton3_Autobahn
 
  // Ende Methoden
} // end of class version2
```


----------



## Robat (30. Aug 2018)

Die Strafen für Autobahn und Außerorts scheinen ja gleich zu sein, d.h. die Abfragen könnte man sich in der Theorie sparen. 
Die Strafe würde ich persönlich als eigene Klasse definieren `Fine` die die Attribute "Punkte in Flensburg", "Bußgeld" und "Fahrverbotslänge" besitzt.

```
public class Fine {
    private final int points;
    private final int fine;
    private final int drivingBanPeriod;

    public Fine( int points, int fine, int drivingBanPeriod ) {
        this.points = points;
        this.fine = fine;
        this.drivingBanPeriod = drivingBanPeriod;
    }

    public String getPointsAsString() {
        return points + " Punkte";
    }

    public String getFineAsString() {
        return fine + "EUR";
    }

    public String getDrivingBanAsString() {
        return drivingBanPeriod + "Monat(e)";
    }
}
```
So kannst du den Geschwindigkeitsdifferenzen eine Strafe zuordnen und das ganze in eine Map passen. Das ganze einmal für Innerorts und für Autobahn/Außerorts.

```
private void initFineMapper() {
    fineMapper = Map.of(
            0, new Fine(0, 0, 0),
            10, new Fine(0, 10, 0),
            15, new Fine(0, 20, 0),
            20, new Fine(0, 30, 0),
            25, new Fine(1, 70, 1),
            30, new Fine(1, 80, 1),
            40, new Fine(1, 120, 1),
            50, new Fine(1, 160, 1),
            60, new Fine(2, 240, 1),
            70, new Fine(2, 440, 2));
    fineMapper.put(-1, new Fine(2, 600, 3));
}

private void initFineMapperInTown() {
    fineMapperInTown = Map.of(
            0, new Fine(0, 0, 0),
            10, new Fine(0, 10, 0),
            15, new Fine(0, 25, 0),
            20, new Fine(0, 35, 0),
            25, new Fine(1, 80, 1),
            30, new Fine(1, 100, 1),
            40, new Fine(2, 160, 1),
            50, new Fine(2, 200, 2),
            60, new Fine(2, 280, 3),
            70, new Fine(2, 480, 3));
    fineMapperInTown.put(-1, new Fine(2, 680, 3));
}
```
So fällt bei der Methode zur Berechnung sehr viel weg und du kannst das ganze auf einige Zeilen beschränken. Der Methode wird einer der Mapper übergeben, um die Strafe zu ermitteln. 

```
private void calculateFine( Map<Integer, Fine> mapper ) {
    int actualSpeed = toInteger(jtfSpeed.getText());
    int maxSpeed = toInteger(jtfMaxSpeed.getText());

    int diff = Math.max(0, actualSpeed - maxSpeed);

    Fine fine = mapper.getOrDefault(diff, mapper.get(-1));
    updateResultRow(fine);
}
```
Hier noch mal der gesamte Code inkl. GUI. Es gibt sicherlich auch noch andere Varianten wie man das umsetzen kann. Vielleicht postet ja noch jemand anderes seine Gedanken dazu. 

```
public class FineCalculator {

    private Map<Integer, Fine> fineMapperInTown;
    private Map<Integer, Fine> fineMapper;

    private JLabel lblPointsInFlensburg;
    private JLabel lblFine;
    private JLabel lblDrivingBan;

    private JTextField jtfSpeed;
    private JTextField jtfMaxSpeed;

    public FineCalculator() {
        initFineMapper();
        initFineMapperInTown();
        buildAndShowUI();
    }

    private void buildAndShowUI() {
        JFrame frame = new JFrame("Bußgeld-Rechner");
        frame.setSize(500, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);

        frame.add(generateDisplayPanel());
        frame.add(generateControlPanel(), BorderLayout.SOUTH);

        frame.setVisible(true);
    }

    private JPanel generateDisplayPanel() {
        JPanel displayPanel = new JPanel();
        displayPanel.setLayout(new BoxLayout(displayPanel, BoxLayout.PAGE_AXIS));

        jtfSpeed = new JTextField(20);
        jtfMaxSpeed = new JTextField(20);

        displayPanel.add(generateLabeledInput("Geschwindigkeit", jtfSpeed));
        displayPanel.add(generateLabeledInput("Maximalgeschwindigkeit", jtfMaxSpeed));
        displayPanel.add(generateResultRow());

        return displayPanel;
    }

    private JPanel generateResultRow() {
        JPanel resultRow = new JPanel(new GridLayout(1, 3));

        lblPointsInFlensburg = new JLabel("Punkte: ");
        resultRow.add(lblPointsInFlensburg);

        lblFine = new JLabel("Bußgeld: ");
        resultRow.add(lblFine);

        lblDrivingBan = new JLabel("Fahrverbot: ");
        resultRow.add(lblDrivingBan);

        return resultRow;
    }

    private JPanel generateLabeledInput( String labelText, JTextField textfiled ) {
        JPanel row = new JPanel();
        row.setAlignmentX(Component.CENTER_ALIGNMENT);
        row.add(new JLabel(labelText));
        row.add(textfiled);
        return row;
    }

    private JPanel generateControlPanel() {
        JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));

        controlPanel.add(generateControlButton("Innerorts", e -> calculateFine(fineMapperInTown)));
        controlPanel.add(generateControlButton("Außerorts", e -> calculateFine(fineMapper)));
        controlPanel.add(generateControlButton("Autobahn", e -> calculateFine(fineMapper)));

        return controlPanel;
    }

    private JButton generateControlButton( String title, ActionListener listener ) {
        JButton button = new JButton(title);
        button.addActionListener(listener);
        button.setAlignmentY(Component.CENTER_ALIGNMENT);
        return button;
    }

    private void calculateFine( Map<Integer, Fine> mapper ) {
        int actualSpeed = toInteger(jtfSpeed.getText());
        int maxSpeed = toInteger(jtfMaxSpeed.getText());

        int diff = Math.max(0, actualSpeed - maxSpeed);

        Fine fine = mapper.getOrDefault(diff, mapper.get(-1));
        updateResultRow(fine);
    }

    private int toInteger(String value) {
        try {
            return Integer.valueOf(value);
        } catch(NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Bitte nur Zahlen eingeben", "Fehler", JOptionPane.ERROR_MESSAGE);
            return 0;
        }
    }

    private void updateResultRow(Fine fine) {
        lblPointsInFlensburg.setText("Punkte: " + fine.getPointsAsString());
        lblFine.setText("Bußgeld: " + fine.getFineAsString());
        lblDrivingBan.setText("Fahrverbot: " + fine.getDrivingBanAsString());
    }

    private void initFineMapper() {
        fineMapper = Map.of(
                0, new Fine(0, 0, 0),
                10, new Fine(0, 10, 0),
                15, new Fine(0, 20, 0),
                20, new Fine(0, 30, 0),
                25, new Fine(1, 70, 1),
                30, new Fine(1, 80, 1),
                40, new Fine(1, 120, 1),
                50, new Fine(1, 160, 1),
                60, new Fine(2, 240, 1),
                70, new Fine(2, 440, 2));
        fineMapper.put(-1, new Fine(2, 600, 3));
    }

    private void initFineMapperInTown() {
        fineMapperInTown = Map.of(
                0, new Fine(0, 0, 0),
                10, new Fine(0, 10, 0),
                15, new Fine(0, 25, 0),
                20, new Fine(0, 35, 0),
                25, new Fine(1, 80, 1),
                30, new Fine(1, 100, 1),
                40, new Fine(2, 160, 1),
                50, new Fine(2, 200, 2),
                60, new Fine(2, 280, 3),
                70, new Fine(2, 480, 3));
        fineMapperInTown.put(-1, new Fine(2, 680, 3));
    }


    public static void main( String[] args ) {
        FineCalculator calculator = new FineCalculator();
    }
}
```


----------



## max40 (30. Aug 2018)

Dein langen Bedinungen könnte man einfacher machen z.B. so:

Die Definitionen für Innerorts:

```
/**
 *
 * Beschreibung
 *
 * @version 1.0 vom 29.08.2018
 * @author
 */

public class version2 extends JFrame {
     
   BußgeldDef[] innerorts = new BußgeldDef[]{
       new BußgeldDef(0,"0","0","Nein"),
       new BußgeldDef(10,"0","10€","Nein"),
       new BußgeldDef(15,"0","25€","Nein"),
       new BußgeldDef(20,"0","35€","Nein"),
       new BußgeldDef(25,"1","80€","Nein"),
       new BußgeldDef(30,"1","100€","1 Monat*"),
       new BußgeldDef(40,"2","160€","1 Monat"),
       new BußgeldDef(50,"2","200€","1 Monat"),
       new BußgeldDef(60,"2","280€","2 Monat"),
       new BußgeldDef(70,"2","480€","3 Monat"),
       new BußgeldDef(999999999, "2","680€", "3 Monat")
   };

 BußgeldDef[] ausserorts = new BußgeldDef[]{
// TODO wie bei innerorts auch für ausserorts
}
 BußgeldDef[] autobahn = new BußgeldDef[]{
// TODO wie bei innerorts auch für autobahn
}
     
  // Anfang Attribute
  private JLabel jLabel1 = new JLabel();

....
```

Dann würde die jButton1_ActionPerformed nur noch so aussehen:

```
public void jButton1_ActionPerformed(ActionEvent evt)
  { int vg, vz, v;
    vg=jNumberField2.getInt();
    vz=jNumberField1.getInt();
    v=vg-vz;
 
    for (BußgeldDef d : innerorts) {
        if (v <= d.getUeberschreitung()) {
            jNumberField3.setText(d.getPunkte());
            jNumberField4.setText(d.getBetrag());
            jNumberField5.setText(d.getFahrverbot());
            break;
        }
    }

  } // end of jButton1_Innerorts
```

Die neue Klasse BußgeldDef:

```
class BußgeldDef {

    final private int ueberschreitung;
    final private String punkte;
    final private String betrag;
    final private String fahrverbot;

    public BußgeldDef(int ueberschreitung, String punkte, String betrag, String fahrverbot) {
        super();
        this.ueberschreitung = ueberschreitung;
        this.punkte = punkte;
        this.betrag = betrag;
        this.fahrverbot = fahrverbot;
    }

    public int getUeberschreitung() {
        return ueberschreitung;
    }

    public String getPunkte() {
        return punkte;
    }

    public String getBetrag() {
        return betrag;
    }

    public String getFahrverbot() {
        return fahrverbot;
    }

}
```


oder ggf. so wie Robats Vorschlag


----------

