Sebi123 Geschrieben 28. Januar 2010 Teilen Geschrieben 28. Januar 2010 Hallo, ich hoffe ihr könnt mir helfen. Bin gerade dabei eine Tabelle (JTable) zu erstellen. Am Ende soll das ganze einen Zimmerbelegungsplan ergeben, der in der Spaltenbeschriftung die 31 Tage anzeigt und in der Zeilenbeschriftung die Zimmernummern. Momentan habe ich eine Matrix, nun möchte ich aber eine feste Spaltenanzahl, aber eine variable Zeilenanzahl (um später Zimmer hinzufügen zu können) anlegen. Was kann ich dazu nutzen? Schon mal vielen Dank im Voraus. Sebi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 28. Januar 2010 Teilen Geschrieben 28. Januar 2010 Du kannst dafür das DefaultTableModel bereits nutzen. DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.setRowCount(+1); ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sebi123 Geschrieben 28. Januar 2010 Autor Teilen Geschrieben 28. Januar 2010 Hallo, vielen Dank für die schnelle Antwort. Die Zeilenerweiterung ( model.setRowCount(+1); ) brauchen wir dann in der Klasse "Zimmer anlegen", aber im Zimmerbelegungsplan sollen ja dann nur die Daten aufgerufen werden, und diese Daten können eben x Zeilen haben. Wie kann ich dann die Tabelle so gestalten, dass sie sich der Anzahl an Datensätzen anpasst? Vielen Dank im Voraus. Grüße, Sebi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 28. Januar 2010 Teilen Geschrieben 28. Januar 2010 Wie kann ich dann die Tabelle so gestalten, dass sie sich der Anzahl an Datensätzen anpasst? Wie meinst Du das genau? Eine Tabelle stellt man normalerweise in ein JScrollPane, so dass sich die JTable dem zur Verfügung stehenden Platz im Dialog anpasst. Sind Änderungen im Inhalt der Tabelle passiert (z.Bsp. neue Zeile im Model), dann ruft man model.fireTableDataChanged() auf und die Tabelle wird benachrichtigt, Resultat: Table wird neu gezeichnet. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 28. Januar 2010 Teilen Geschrieben 28. Januar 2010 Der JTable ist egal wie viele Spalten und wie viele Zeilen du anlegen möchtest, das ist vollständig variable, sowohl beim anlegen als auch später beim erweitern. Das heißt in deinem Fall erzeugst du deine JTable wie du sie haben möchtest und übergibst die Daten die Anfangs in der Tabelle stehen sollen. Wenn im Programmverlauf weitere Zeilen hinkommen die in deine Tabelle eingefügt werden sollen, dann kannst du das über das Model der JTable erledigen. Diesen bekommst du von der JTable über die Methode getModel(). Das Model bietet das Methoden an um Daten hinzuzufügen, zu ändern oder zu löschen. Für weitere Informationen schauste dir am besten die Java Doku zum DefaultTableModel an. Dort vor allem die Methode )]addRow(). Falls das dein Problem noch immer nicht löst, wäre eine ausführlichere Beschreibung gut. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sebi123 Geschrieben 3. Februar 2010 Autor Teilen Geschrieben 3. Februar 2010 Danke für die bisherigen Antworten. Wie im Eröffnungspost erwähnt, muss ich einen Zimmerbelegungsplan, als Teil eines Hotelbuchnungssystems, erstellen. Dieser beinhaltet einen Kalender. Zum Layout: oben soll ein Datum (Monat, Jahr) ausgewählt werden können, in der Mitte sollen die dazugehörigen Tage (1-31) angezeigt werden. Buchbare Tage werden später farblich dargestellt. Die ComboBox mit der Datumsauswahl kriege ich hin, aber der Kalender in der Mitte... das will nicht funktionieren. Ich bin mal so frei und poste den gesamten Code, den ich bisher habe: import javax.swing.*; import java.awt.*; import java.awt.BorderLayout; import java.awt.Point; import java.util.Hashtable; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; public class ZimmerbelegungAnzeigenTest { public static void main( String[] args ){ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel paneltabelle = new JPanel(); JPanel panelauswahl = new JPanel(); JPanel panellegende = new JPanel(); paneltabelle.setBackground(Color.GREEN); panelauswahl.setBackground(Color.PINK); panellegende.setBackground(Color.YELLOW); //Panels erstellen, Farbe ändern String headers[] = { "Zimmernummer", "Zimmerkategorie", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" }; TableModel model = new MyTableModel(0, headers); JTable table = new JTable(model); table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); table.getColumn( "Zimmernummer" ).setPreferredWidth( 100 ); table.getColumn( "Zimmerkategorie" ).setPreferredWidth( 100 ); table.getColumn( "1" ).setPreferredWidth( 30 ); table.getColumn( "2" ).setPreferredWidth( 30 ); table.getColumn( "3" ).setPreferredWidth( 30 ); table.getColumn( "4" ).setPreferredWidth( 30 ); table.getColumn( "5" ).setPreferredWidth( 30 ); table.getColumn( "6" ).setPreferredWidth( 30 ); table.getColumn( "7" ).setPreferredWidth( 30 ); table.getColumn( "8" ).setPreferredWidth( 30 ); table.getColumn( "9" ).setPreferredWidth( 30 ); table.getColumn( "10" ).setPreferredWidth( 30 ); table.getColumn( "11" ).setPreferredWidth( 30 ); table.getColumn( "12" ).setPreferredWidth( 30 ); table.getColumn( "13" ).setPreferredWidth( 30 ); table.getColumn( "14" ).setPreferredWidth( 30 ); table.getColumn( "15" ).setPreferredWidth( 30 ); table.getColumn( "16" ).setPreferredWidth( 30 ); table.getColumn( "17" ).setPreferredWidth( 30 ); table.getColumn( "18" ).setPreferredWidth( 30 ); table.getColumn( "19" ).setPreferredWidth( 30 ); table.getColumn( "20" ).setPreferredWidth( 30 ); table.getColumn( "21" ).setPreferredWidth( 30 ); table.getColumn( "22" ).setPreferredWidth( 30 ); table.getColumn( "23" ).setPreferredWidth( 30 ); table.getColumn( "24" ).setPreferredWidth( 30 ); table.getColumn( "25" ).setPreferredWidth( 30 ); table.getColumn( "26" ).setPreferredWidth( 30 ); table.getColumn( "27" ).setPreferredWidth( 30 ); table.getColumn( "28" ).setPreferredWidth( 30 ); table.getColumn( "29" ).setPreferredWidth( 30 ); table.getColumn( "30" ).setPreferredWidth( 30 ); table.getColumn( "31" ).setPreferredWidth( 30 ); //JScrollPane scrollPane = new JScrollPane(table); //frame.getContentPane().add(scrollPane, BorderLayout.CENTER); //frame.setSize(1150, 300); //frame.setVisible(true); String januar = new String ("Januar"); String februar = new String ("Februar"); String maerz = new String ("März"); String april = new String ("April"); String mai = new String ("Mai"); String juni = new String ("Juni"); String juli = new String ("Juli"); String august = new String ("August"); String september = new String ("September"); String oktober = new String ("Oktober"); String november = new String ("November"); String dezember = new String ("Dezember"); JLabel monatslabel = new JLabel("Monat auswählen:"); JComboBox monatsauswahl = new JComboBox(); monatsauswahl.addItem(januar); monatsauswahl.addItem(februar); monatsauswahl.addItem(maerz); monatsauswahl.addItem(april); monatsauswahl.addItem(mai); monatsauswahl.addItem(juni); monatsauswahl.addItem(juli); monatsauswahl.addItem(august); monatsauswahl.addItem(september); monatsauswahl.addItem(oktober); monatsauswahl.addItem(november); monatsauswahl.addItem(dezember); JLabel jahreslabel = new JLabel("Jahr auswählen:"); JSpinner jahresauswahl = new JSpinner(); jahresauswahl.setValue(2010); JButton uebernehmen = new JButton("Übernehmen"); JLabel legende = new JLabel("Legende:"); //paneltabelle.setLayout(new GridLayout(100,100)); //panelauswahl.setLayout(new GridLayout(100,100)); //Panels konfigurieren, Layoutmanager wählen panelauswahl.add(monatslabel); panelauswahl.add(monatsauswahl); panelauswahl.add(jahreslabel); panelauswahl.add(jahresauswahl); panelauswahl.add(uebernehmen); //hinzufügen der Elemente zum oberen Panel //paneltabelle.add(); paneltabelle.add(table); //hinzufügen der Elemente zum mittleren Panel panellegende.add(legende); frame.getContentPane().add(BorderLayout.NORTH, panelauswahl); frame.getContentPane().add(BorderLayout.CENTER, paneltabelle); frame.getContentPane().add(BorderLayout.SOUTH, panellegende); frame.setSize(800, 600); frame.setVisible(true); } } class MyTableModel extends AbstractTableModel { private Hashtable lookup; private final int rows; private final int columns; private final String headers[]; public MyTableModel(int rows, String columnHeaders[]) { if ((rows < 0) || (columnHeaders == null)) { throw new IllegalArgumentException( "Invalid row count/columnHeaders"); } this.rows = rows; this.columns = columnHeaders.length; headers = columnHeaders; lookup = new Hashtable(); } public int getColumnCount() { return columns; } public int getRowCount() { return rows; } public String getColumnName(int column) { return headers[column]; } public Object getValueAt(int row, int column) { return lookup.get(new Point(row, column)); } public void setValueAt(Object value, int row, int column) { if ((rows < 0) || (columns < 0)) { throw new IllegalArgumentException("Invalid row/column setting"); } if ((row < rows) && (column < columns)) { lookup.put(new Point(row, column), value); }}} Das letzte Fragment: MyTableModel... der Code ist nicht von mir und ich verstehe ihn auch nicht so recht. Das Problem ist vorerst, dass mein Center-Panel leer bleibt. Da sollte aber die Tabelle mit den Spalten der Kalendertage 1-31 (von links nach rechts) dargestellt werden. Kann mir jemand weiterhelfen? Dass ich sowas wie ein Java-Anfänger bin, versteht sich von selbst . Vielen Dank an alle Helfer! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 4. Februar 2010 Teilen Geschrieben 4. Februar 2010 (bearbeitet) Das im mittleren Panel deine Tabelle noch nicht angezeigt wird, liegt einfach daran, dass sie leer ist, damit kann auch nichts angezeigt werden. Wenn du die Tabelle jetzt mit Daten befüllen würdest, wäre dort auch was zu sehen. Das jetzt aber auch noch nicht mal die Spalten der leeren Tabelle zu sehen sind, ist auch normal. Die wären in deinem Fall auch nicht zu sehen wenn Daten in der Tabelle vorhanden wären, da man sich entweder über die Methode getTableHeader() selber die Komponente für die Spaltenüberschriften besorgen und dann anzeigen lassen muss, oder man verpackt die gesamte Tabelle einfach in eine JScrollPane. In dem Fall setzt die JTable automatisch ihren Header in den NORTH - Viewport der JScrollPane. Wenn du also die Zeile in der du deine Tabelle dem Panel 'paneltabelle' hinzufügst, folgendermaßen umänderst, wird die Tabelle auch im leeren Zustand mit Headern angezeigt: paneltabelle.add(new JScrollPane(table)); Und wenn du vor diese Zeile noch folgende Zeile setzt, erstreckt sich die Tabelle sogar über den gesamten verfügbaren Platz in der Mitte: paneltabelle.setLayout(new BorderLayout()); Dann zu deinem eigenem TableModel, ich gehe mal davon aus, wenn du sagst du verstehst nicht was da passiert, dass du das TableModel irgendwo aus dem Internet und einfach eingefügt hast? Wenn das der Fall ist, lösch es wieder. Für deine bisherigen Vorgaben brauchst du kein eigenes TableModel. Schlimmer noch, mit dem eigenem TableModel hast du dir bisher die Möglichkeit verbaut, nachträglich einfach Zeilen in die Tabelle hinzuzufügen. Benutze also lieber die schon von Java vorhandenen Mittel, in dem Fall das DefaultTableModel. Dieses bietet dir einen ähnlichen Konstruktor an wie du schon bei deinem eigenem TableModel hast, unterstützt die Möglichkeit nachträglich Daten in die Tabelle einzutragen und funktioniert einfach ohne Probleme Das heißt die Zeile in der du dein TableModel erzeugst, änderst du einfach folgendermaßen um: DefaultTableModel model = new DefaultTableModel(headers, 0); Damit dürften sich deine jetzigen Probleme dann eigentlich erledigt haben. Bearbeitet 4. Februar 2010 von Dragon8 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sebi123 Geschrieben 4. Februar 2010 Autor Teilen Geschrieben 4. Februar 2010 DANKE! Hat funktioniert. Nächste Frage: jahresauswahl.setValue(2010); ...wird als "2.010" ausgegeben. Wie kriege ich den Punkt weg? Das soll eine ganze Jahreszahl werden, wie man sich denken kann . Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Ulfmann Geschrieben 4. Februar 2010 Teilen Geschrieben 4. Februar 2010 Wie kriege ich den Punkt weg? Ich schätze der einfachste Weg wäre, die Zahl als String zu übergeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 4. Februar 2010 Teilen Geschrieben 4. Februar 2010 Der Fehler liegt einfach daran, dass du beim JSpinner nicht festgelegt hast, als was er deinen Wert interpretieren soll, dass heißt, für ihn ist die '2010' einfach nur eine Zahl, die er dementsprechend auch als Zahl darstellt. Das Jahr 2010 wäre aber ein Datum, das heißt du musst die Darstellung umändern. Wenn man sich die Java Dokumentation dazu, und das Tutorial von Sun für JSpinner anschaut, wird dort auch gezeigt wie das gemacht wird. Du brauchst erstmal für den JSpinner ein anders Model, das SpinnerDateModel. Dieses ist dafür verantwortlich Datumstypen im JSpinner zu verarbeiten. Und damit das Datum richtig angezeigt wird, musst du den Editor des JSpinners noch neubelegen, nämlich mit einem DateEditor. Diesem kannst du das Format mitgeben, wie er das Datum anzeigen soll. Folgendermaßen erzeugst du dir also einen JSpinner der dir nur die Jahreszahl anzeigt und diese hoch- und runterzählen kann: JSpinner jahresauswahl = new JSpinner(new SpinnerDateModel()); jahresauswahl.setEditor(new JSpinner.DateEditor(jahresauswahl, "yyyy")); Der String im Konstruktor des DateEditors gibt an, wie das Datum angezeigt werden soll, wenn du das jetzt auf "MMM yyyy" wird kann der Benutzer im JSpinner sogar den Monat und das Jahr auswählen, wenn du dort 'MMMM' nimmst wird der Monat ausgeschrieben angezeigt, usw usf, da gibt es noch allerhand was man einstellen kann Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Sebi123 Geschrieben 13. Februar 2010 Autor Teilen Geschrieben 13. Februar 2010 Hi! Das mit dem Kalender hat super funktioniert. Ich werde meine nächsten Fragen vorerst hier reinposten, auch wenn es gerade nicht mehr viel mit "Befüllung JTable" zu tun hat. Ich habe ein (Main-)Frame, in dem Buttons aufgeführt sind, z.B. "CheckIn", "CheckOut", "Gast anlegen" und so Zeugs. Das stellt die Anwendungsoberfläche dar. Wenn einer der Buttons angeklickt wird, soll ein anderes Frame aufgerufen werden. Dieses andere, fertige Frame enthält bereits Buttons, Textfelder usw. Nun suche ich nach einer Methode, wie ich dieses andere Frame aufrufe, wenn ein Button in der Anwendungsoberfläche angeklickt wird. Funktioniert das überhaupt so? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MartinSt Geschrieben 13. Februar 2010 Teilen Geschrieben 13. Februar 2010 mach ein actionlistener auf den/die Button Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.