package javacodebook.gui.tablemodel; import javax.swing.*; import java.awt.event.*; import java.awt.*; /** * In diesem JFrame wird eine Tabelle platziert. Die Werte der Tabelle werden * über eine Instanz der Klasse NameTableModel zur Verfügung gestellt. */ public class EingabeJFrame extends JFrame { private Container content = null; JLabel nameLabel = new JLabel("Name"); JLabel cityLabel = new JLabel("Stadt"); JLabel streetLabel = new JLabel("Strasse"); JTextField nameTextField = new JTextField(20); JTextField cityTextField = new JTextField(20); JTextField streetTextField = new JTextField(20); JButton submit = new JButton("Submit"); NameTableModel model = null; /** * Konstruktor von TableModelJFrame. */ public EingabeJFrame(NameTableModel ntm, String title) { super(title); this.model= ntm; content = this.getContentPane(); content.setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); submit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { model.addTriple(nameTextField.getText(), cityTextField.getText(), streetTextField.getText()); } }); content.add(nameLabel); content.add(nameTextField); content.add(cityLabel); content.add(cityTextField); content.add(streetLabel); content.add(streetTextField); content.add(submit); } } package javacodebook.gui.tablemodel; import javax.swing.table.AbstractTableModel; import java.util.*; /** * Diese Klasse NameTableModel liefert die Inhalte für die JTable. * Durch die Trennung von Inhalt und Darstellung kann zum einen * dieser Inhalt sehr einfach auch anderen Komponenten dienen, zum * anderen erreicht man durch die Modularisierung eine elegante Trennung, * die gerade bei dynamischen Inhalten ein übersichtlicheres * Design mit sich bringt. */ public class NameTableModel extends AbstractTableModel { /** * Werte der Tabelle, werden intern in einer ArrayList abgelegt. */ private ArrayList dataValues = new ArrayList(); /** * Überschriften der Tabelle, sind hier auch hart codiert. */ private String columnNames[] = { "Name", "Stadt", "Strasse" }; /** * Der interne Datenspeicher wird bereits mit einigen Einträgen gefüllt. */ public NameTableModel() { addTriple("Andi Arbeit", "Soest", "Terlindenweg"); addTriple("Manuel Einstellbar", "Karlsruhe", "Kaiserallee"); addTriple("Sigrid Sörwis", "Berlin", "Winsstrasse"); addTriple("Miss Mutig", "Stockholm", "Kungshamra"); } /** * Die JTable braucht zur Darstellung Information über die Spaltenanzahl. */ public int getRowCount() { return dataValues.size(); } /** * Die JTable braucht zur Darstellung Information über die Zeilennanzahl. */ public int getColumnCount() { return columnNames.length; } /** * Zur Darstellung der Überschriften, benötigt die JTable die Namen. */ public String getColumnName(int column){ return (String)columnNames[column]; } /** * Die JTable braucht zur Darstellung die Daten an jeder Position */ public Object getValueAt(int rowIndex, int columnIndex) { return ((String[])dataValues.get(rowIndex))[columnIndex]; } /** * Neue Einträge in den internen Datenspeicher, und somit in die Tabelle * können über diese Methode gemacht werden. */ public void addTriple(String name, String city, String street){ String[] triple={name,city,street}; dataValues.add(triple); fireTableDataChanged(); } } --- Neue Klasse --- package javacodebook.gui.tablemodel; import javax.swing.*; import java.awt.event.*; import java.awt.*; /** * In diesem JFrame wird eine Tabelle platziert. Die Werte der Tabelle werden * über eine Instanz der Klasse NameTableModel zur Verfügung gestellt. */ public class TableModelJFrame extends JFrame { /** * Das NameTableModel wird instanziiert. */ private NameTableModel ntm = new NameTableModel(); /** * Im Konstruktor der Tabelle wird eine Instanz unseres NameTableModels * übergeben, sämtliche Inhalte werden von ihm geliefert. */ private JTable table = new JTable(ntm); /** * JScrollpane stellt per Default die Tabellenüberschriften von * eingebetteten Tabellen dar. Legt man die Tabelle einfach in ein * Panel, würden keine Überschriften erscheinen. */ private JScrollPane scrollPane = new JScrollPane(); private Container content = null; /** * Konstruktor von TableModelJFrame. */ public TableModelJFrame(String title) { super(title); content = this.getContentPane(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Das Einabe Frame wird gebaut EingabeJFrame ef = new EingabeJFrame(ntm,"Fenster für Tabellen Eingabe"); ef.setLocation(100,50); ef.setSize(300,150); ef.setVisible(true); // Eine Scrollpane darf nicht direkt, sondern muss immer // über Ihren Viewport bestückt werden. scrollPane.getViewport().add(table); // ScrollPane wird auf die contentPane gelegt content.add(scrollPane); } }