Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben
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.

Geschrieben

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.

Geschrieben

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!

Geschrieben (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 von Dragon8
Geschrieben

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 :).

Geschrieben

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

  • 2 Wochen später...
Geschrieben

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?

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...