diff --git a/.idea/libraries/formdev_flatlaf.xml b/.idea/libraries/formdev_flatlaf.xml new file mode 100644 index 0000000..2d29c33 --- /dev/null +++ b/.idea/libraries/formdev_flatlaf.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 355059e..0f64eca 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + diff --git a/AufgabenBlatt11/src/aufgabe2/Taube.java b/AufgabenBlatt11/src/aufgabe2/Taube.java index 8308a27..8451a1f 100644 --- a/AufgabenBlatt11/src/aufgabe2/Taube.java +++ b/AufgabenBlatt11/src/aufgabe2/Taube.java @@ -24,3 +24,5 @@ public class Taube implements Fliegen { System.out.println("GuuurrrGuurrr"); } } + + diff --git a/AufgabenBlatt13/.gitignore b/AufgabenBlatt13/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/AufgabenBlatt13/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/AufgabenBlatt13/AufgabenBlatt13.iml b/AufgabenBlatt13/AufgabenBlatt13.iml new file mode 100644 index 0000000..f8639ef --- /dev/null +++ b/AufgabenBlatt13/AufgabenBlatt13.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/AufgabenBlatt13/res/BuecherCSV.csv b/AufgabenBlatt13/res/BuecherCSV.csv new file mode 100644 index 0000000..fe0e6e5 --- /dev/null +++ b/AufgabenBlatt13/res/BuecherCSV.csv @@ -0,0 +1,12 @@ +Titel,Autor,Verlag,Preis,Verfügbar, +Atlas - Die Geschichte von Pa Salt,Lucinda Riley | Harry Whittaker,Goldmann,24,ja, +Das Cafe ohne Namen,Robert Seethaler,Claassen,24,ja, +Melody,Suter, Martin,26,ja +Blue Skies,T.C. Boyle,Hanser,28,nein, +Dark Sigils - Wie die Dunkelheit befiehlt,Anna Benning,Fischer,20,ja, +Eine Frage der Chemie,Bonnie Garmus,Piper,24,ja, +Der letzte Sessellift,John Irving,Diogenes,26,ja, +Liebe oder Eierlikör - Fast eine Romanze,Heldt, Dora,15,ja +Die Unverbesserlichen - Die Revanche des Monsieur Lipaire,Volker Klöpfel | Michael Kobr,Ullstein,20,nein, +Pompeji oder Die fünf Reden des Jowna,Ruge, Eugen,25,nein +Die Liebe an miesen Tagen,Ewald Arenz,Dumont,28,nein, diff --git a/AufgabenBlatt13/src/aufgabe1/Book.java b/AufgabenBlatt13/src/aufgabe1/Book.java new file mode 100644 index 0000000..fb0c16f --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe1/Book.java @@ -0,0 +1,15 @@ +package aufgabe1; + +public record Book(String title, String author, String verlag, double value, boolean available) { + + public static Book parseFromCommaSeparatedString(String line) { + var values = line.split(","); + try { + return new Book(values[0], values[1], values[2], Double.parseDouble(values[3]), Boolean.parseBoolean(values[4])); + } catch (ArrayIndexOutOfBoundsException ignored) { + throw new IllegalArgumentException("not enough entries for book"); + } catch (NumberFormatException ignored) { + throw new IllegalArgumentException("value of book not a number"); + } + } +} \ No newline at end of file diff --git a/AufgabenBlatt13/src/aufgabe1/BookDatabase.java b/AufgabenBlatt13/src/aufgabe1/BookDatabase.java new file mode 100644 index 0000000..c18aa88 --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe1/BookDatabase.java @@ -0,0 +1,36 @@ +package aufgabe1; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; + +public record BookDatabase(List books) { + + public static BookDatabase readFromFile(File file) { + if (!file.exists() || !file.canRead() || file.isDirectory()) + throw new IllegalArgumentException("Cannot read from file"); + + try { + var source = Files.readString(Paths.get(file.getPath()), StandardCharsets.UTF_8); + + var books = source.lines().skip(1).map(Book::parseFromCommaSeparatedString).toList(); + + return new BookDatabase(books); + } catch (ArrayIndexOutOfBoundsException | IOException e) { + throw new IllegalStateException("Cannot read from file: " + e); + } + } + + public Optional getBook(String title) { + return books.stream().filter(book -> book.title().equals(title)).findFirst(); + } + + public List getTitles() { + return books.stream().map(Book::title).toList(); + } +} diff --git a/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.form b/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.form new file mode 100644 index 0000000..0d713bf --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.form @@ -0,0 +1,160 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.java b/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.java new file mode 100644 index 0000000..f8bec9c --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe1/BookDatabaseViewer.java @@ -0,0 +1,93 @@ +package aufgabe1; + +import javax.swing.*; +import java.awt.event.*; +import java.util.Optional; + +public class BookDatabaseViewer extends JDialog { + private JPanel contentPane; + private JButton buttonOK; + private JButton buttonCancel; + private JComboBox comboBoxTitle; + private JTextField textFieldTitle; + private JTextField textFieldAuthor; + private JTextField textFieldVerlag; + private JTextField textFieldValue; + private JButton verfuegbarkeitPruefenButton; + + private final BookDatabase bookDatabase; + + private Optional currentBook = Optional.empty(); + + public BookDatabaseViewer(BookDatabase bookDatabase) { + setContentPane(contentPane); + setModal(true); + getRootPane().setDefaultButton(buttonOK); + setTitle("Book Database"); + + this.bookDatabase = bookDatabase; + + buttonOK.addActionListener(e -> onOK()); + + buttonCancel.addActionListener(e -> onCancel()); + + textFieldValue.setEditable(false); + textFieldVerlag.setEditable(false); + textFieldAuthor.setEditable(false); + textFieldTitle.setEditable(false); + + // call onCancel() when cross is clicked + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + onCancel(); + } + }); + + // call onCancel() on ESCAPE + contentPane.registerKeyboardAction(e -> onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + comboBoxTitle.addActionListener(e -> { + SwingUtilities.invokeLater(this::selectTitle); + }); + verfuegbarkeitPruefenButton.addActionListener(this::checkAvailability); + + bookDatabase.getTitles().forEach(comboBoxTitle::addItem); + + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + pack(); + setLocationByPlatform(true); + setVisible(true); + } + + private void checkAvailability(ActionEvent actionEvent) { + if (currentBook.isPresent()) { + var book = currentBook.get(); + + JOptionPane.showMessageDialog(this, "Is the book available? " + (book.available() ? "Yes" : "No")); + } + } + + private void selectTitle() { + var title = (String) this.comboBoxTitle.getSelectedItem(); + currentBook = bookDatabase.getBook(title); + + if (currentBook.isPresent()) { + var book = currentBook.get(); + + this.textFieldTitle.setText(book.title()); + this.textFieldAuthor.setText(book.author()); + this.textFieldValue.setText(String.format("%.2f€", book.value())); + this.textFieldVerlag.setText(book.verlag()); + } + } + + private void onOK() { + // add your code here + dispose(); + } + + private void onCancel() { + // add your code here if necessary + dispose(); + } +} diff --git a/AufgabenBlatt13/src/aufgabe1/Main.java b/AufgabenBlatt13/src/aufgabe1/Main.java new file mode 100644 index 0000000..fdaffac --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe1/Main.java @@ -0,0 +1,30 @@ +package aufgabe1; + +import com.formdev.flatlaf.FlatDarculaLaf; +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; + +public class Main { + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(new FlatDarculaLaf()); + } catch (UnsupportedLookAndFeelException e) { + throw new RuntimeException(e); + } + SwingUtilities.invokeLater(Main::init); + } + + private static void init() { + var chooser = new JFileChooser(); + chooser.addChoosableFileFilter(new FileNameExtensionFilter("csv files", "csv")); + chooser.setDialogType(JFileChooser.OPEN_DIALOG); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setMultiSelectionEnabled(false); + + if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + var file = chooser.getSelectedFile(); + + new BookDatabaseViewer(BookDatabase.readFromFile(file)); + } + } +} \ No newline at end of file diff --git a/AufgabenBlatt13/src/aufgabe2/Calculate.java b/AufgabenBlatt13/src/aufgabe2/Calculate.java new file mode 100644 index 0000000..a9e85ea --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe2/Calculate.java @@ -0,0 +1,6 @@ +package aufgabe2; + +public interface Calculate { + + Double calculate(Double x, Double y); +} diff --git a/AufgabenBlatt13/src/aufgabe2/Calculator.form b/AufgabenBlatt13/src/aufgabe2/Calculator.form new file mode 100644 index 0000000..68cbea1 --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe2/Calculator.form @@ -0,0 +1,177 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/AufgabenBlatt13/src/aufgabe2/Calculator.java b/AufgabenBlatt13/src/aufgabe2/Calculator.java new file mode 100644 index 0000000..0bdf7d8 --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe2/Calculator.java @@ -0,0 +1,84 @@ +package aufgabe2; + +import javax.swing.*; +import java.awt.event.*; + +public class Calculator extends JDialog { + private JPanel contentPane; + private JButton buttonOK; + private JButton buttonCancel; + private JTextField operandOneTextField; + private JTextField operandTwoTextField; + private JButton addButton; + private JButton subButton; + private JButton MulButton; + private JButton divButton; + private JLabel Result; + private JTextField resultTextField; + + public Calculator() { + setContentPane(contentPane); + setModal(true); + getRootPane().setDefaultButton(buttonOK); + + buttonOK.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onOK(); + } + }); + + buttonCancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onCancel(); + } + }); + + // call onCancel() when cross is clicked + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + onCancel(); + } + }); + + // call onCancel() on ESCAPE + contentPane.registerKeyboardAction(new ActionListener() { + public void actionPerformed(ActionEvent e) { + onCancel(); + } + }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + + addButton.addActionListener(e -> calculate(Double::sum)); + subButton.addActionListener(e -> calculate((a,b) -> a - b)); + MulButton.addActionListener(e -> calculate((a,b) -> a * b)); + divButton.addActionListener(e -> calculate((a,b) -> a / b)); + + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + pack(); + setLocationByPlatform(true); + setVisible(true); + } + + private void calculate(Calculate operation) { + try { + var op0 = Double.parseDouble(operandOneTextField.getText()); + var op1 = Double.parseDouble(operandTwoTextField.getText()); + + var res = operation.calculate(op0, op1); + + resultTextField.setText(res.toString()); + } catch (NumberFormatException e) { + JOptionPane.showInternalMessageDialog(null, "Operand numbers must be valid", "Calculation", JOptionPane.ERROR_MESSAGE); + } + } + + private void onOK() { + // add your code here + dispose(); + } + + private void onCancel() { + // add your code here if necessary + dispose(); + } +} diff --git a/AufgabenBlatt13/src/aufgabe2/Main.java b/AufgabenBlatt13/src/aufgabe2/Main.java new file mode 100644 index 0000000..4f1a2b4 --- /dev/null +++ b/AufgabenBlatt13/src/aufgabe2/Main.java @@ -0,0 +1,10 @@ +package aufgabe2; + +import javax.swing.*; + +public class Main { + + public static void main(String[] args) { + SwingUtilities.invokeLater(Calculator::new); + } +}