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