Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] - 2zeilige Tabellen?


Ganon
2005-03-29, 17:31:59
Hi.

Mal ne kurze Frage.

Ist es mit einem Java-GUI-Toolkit möglich, Tabellen 2zeilig zu machen? Oder generell eigentlich 2 Spalten in einer anzuzeigen?

Also ich habe z.B. in einer SQL-Datenbank z.B. die Kennung, Nr und Bezeichnung.

Jetzt möchte ich aber es NICHT so anzeigen:
Kennung | Nr | Bezeichnung

sondern:

Vorgang | Bezeichnung

Vorgang ist hierbei Kennung und Nr zusammen. Aber jedes "Feld" soll immernoch einzeln anwählbar sein. D.h. in der Abfrage Kennung und Nr zusammenziehen erfüllt nicht den Zweck.

Genauso die Frage ob es auch untereinander geht. z.B. Bezeichnung und Bezeichnung2.

Statt nebeneinander, untereinander in >einer< Spalte.

Geht das? Und wenn ja, hat jemand eine Anleitung dazu?

Danke. :)

HellHorse
2005-03-29, 19:32:16
JTable. Da kannst du _alles_ in eine Zeille packen, Tables, Trees, alles.
Gib mir einen Moment und ich hacke dir was zusammen.

HellHorse
2005-03-29, 23:25:03
Sorry, dass es so lange ging. Swing war gerade nicht willig und etwas anderes kam mir dazwischen. :redface:

Dann wollen wir mal. Zuerst die Model Klasse (wenn wir schon dabei sind, könne wir auch gleich MVC machen):
package gui.ganon;

import java.util.ArrayList;
import java.util.List;

public class Activity {
private String name;
private int id;
private String description;

public Activity(int id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}

public int getId() {
return this.id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return this.name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return this.description;
}

public void setDescription(String description) {
this.description = description;
}

public static List<Activity> examples() {
List<Activity> examples = new ArrayList<Activity>(2);
examples.add(new Activity(1, "posten", "was ins Forum schreiben"));
examples.add(new Activity(2, "pennen", "flach hinlegen"));
examples.add(new Activity(0x1337, "rul0rn", "n4ps p0w3n"));
examples.add(new Activity(0x1abe, "suxx0rn", "g3p0w3d werden"));
return examples;
}
}

Dann das TableModel für die eigentiche Tabelle

package gui.ganon;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class MultipleActivitesModel extends AbstractTableModel {
private List<Activity> rows;

public MultipleActivitesModel() {
super();
this.setRows(new ArrayList<Activity>(0));
}

public MultipleActivitesModel(List<Activity> rows) {
super();
this.setRows(rows);
}

public int getRowCount() {
return this.rows.size();
}

public int getColumnCount() {
return 2;
}

public List<Activity> getRows() {
return this.rows;
}

public void setRows(List<Activity> rows) {
this.rows = rows;
}

public Object getValueAt(int rowIndex, int columnIndex) {
Activity row = this.rows.get(rowIndex);
if (columnIndex == 0) {
return row;
}
return row.getDescription();
}

public Class< ? > getColumnClass(int columnIndex) {
if (columnIndex == 0) {
return Activity.class;
}
return String.class;
}

public String getColumnName(int columnIndex) {
if (columnIndex == 0) {
return "Activity";
}
return "Description";
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
this.rows.get(rowIndex).setDescription((String) aValue);
}

public static TableModel example() {
return new MultipleActivitesModel(Activity.examples());
}
}


Der Renderer der eine Tablle in eine Zelle rendert:
package gui.ganon;

import java.awt.Component;

import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class InnerRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {

private JTable table;

public InnerRenderer() {
this.table = new JTable();
}

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
this.table.setModel(new SingleActivityModel((Activity) value));
return this.table;
}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.table.setModel(new SingleActivityModel((Activity) value));
return this.table;
}

public Object getCellEditorValue() {
return null;
}
}

Dann das TableModel für die Tabelle in der Zelle:
package gui.ganon;

import javax.swing.table.AbstractTableModel;

public class SingleActivityModel extends AbstractTableModel {
private Activity activity;

public SingleActivityModel() {
super();
}

public SingleActivityModel(Activity activity) {
super();
this.activity = activity;
}

public Activity getActivity() {
return this.activity;
}

public void setActivity(Activity activity) {
this.activity = activity;
}

public int getColumnCount() {
return 2;
}

public int getRowCount() {
return 1;
}

public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return this.activity.getId();
}
return this.activity.getName();
}

public String getColumnName(int columnIndex) {
if (columnIndex == 0) {
return "ID";
}
return "Name";
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
// TODO save to db
if (columnIndex == 0) {
try {
int intValue = Integer.parseInt((String) aValue);
this.activity.setId(intValue);
} catch (NumberFormatException nfe) {
//do nothing
}
} else {
this.activity.setName((String) aValue);
}
}
}


Und schlussendlich noch eine Klasse um das ganze laufen zu lassen:

package gui.ganon;

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
import static javax.swing.SwingUtilities.invokeLater;

public class MultiTableDemo extends JPanel {

public MultiTableDemo() {
super(new GridLayout(1,0));

JTable table = new JTable(MultipleActivitesModel.example());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
InnerRenderer renderer = new InnerRenderer();
table.setDefaultEditor(Activity.class, renderer);
table.setDefaultRenderer(Activity.class, renderer);

//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);

//Add the scroll pane to this panel.
add(scrollPane);
}

public static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

//Create and set up the content pane.
MultiTableDemo newContentPane = new MultiTableDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}


Sieht zuerst nach viel Code aus, ist aber nicht. Das Meiste lässt sich schnell mit der IDE erzeugen.

Ganon
2005-03-31, 11:27:26
:eek:

Ui. Das ist wirklich viel Code. Naja.

Ich acker mich mal durch. ;)

Danke. :)

HellHorse
2005-03-31, 16:17:20
Der wichtige Code ist eigentlich nur.

table.setDefaultRenderer(Activity.class, renderer);

Der Rest ist eigentlich nur Beigemüse um es ein richtiges Beispiel zu machen.