Heho,
ich habe folgendes Problem:
In einer kleinen GUI befindet sich u.A. eine Combobox und eine Tabelle. Wenn ich den Wert in der ComboBox durch Auswahl ändere soll sich der komplette Tabelleninhalt ändern. Und genau da komm ich nicht weiter. Ich hab die neuen Daten quasi schon im TableModel das von der Tabelle verwendet wird, aber ich kann der Tabelle irgendwie nicht sagen dass es die Daten aus dem Model neu laden soll.
Hier der Code der GUI:
Und der Code des Tabellen-Modells:
ich habe folgendes Problem:
In einer kleinen GUI befindet sich u.A. eine Combobox und eine Tabelle. Wenn ich den Wert in der ComboBox durch Auswahl ändere soll sich der komplette Tabelleninhalt ändern. Und genau da komm ich nicht weiter. Ich hab die neuen Daten quasi schon im TableModel das von der Tabelle verwendet wird, aber ich kann der Tabelle irgendwie nicht sagen dass es die Daten aus dem Model neu laden soll.
Hier der Code der GUI:
Code:
package xxx;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import de.siemens.ipns.scc.stg.model.GetSet;
import de.siemens.ipns.scc.stg.model.GetSetNumbers;
import de.siemens.ipns.scc.stg.model.SqlStatement;
import de.siemens.ipns.scc.stg.model.SqlStatementWithArgs;
import de.siemens.ipns.scc.stg.model.TableSetView;
/* TODO: Action Listener schreiben
* TODO: Spaltensortierung ermöglichen
*/
public class SetView {
private JFrame frame_;
private JLabel waehlen_;
private JLabel aendern_;
private JPanel tableViewport_;
private JPanel setChoiceViewport_;
private JPanel aendernViewport_;
private JComboBox setChoice_;
private ResultSet setsNrs_;
private ResultSet sets_;
private JButton aendernButton_;
private ActionListener getSetContentListener = new getSetContentController();
private Connection con;
private TableSetView contentTable_;
public SetView(Connection con) {
// Erstellen des Frames
this.con = con;
frame_ = new JFrame("Set-Anzeige");
frame_.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame_.getContentPane().setLayout(new BorderLayout());
frame_.setResizable(false);
setChoiceViewport_ = new JPanel();
setChoiceViewport_.setLayout(new BorderLayout());
setChoiceViewport_.setPreferredSize(new Dimension(600, 20));
setChoiceViewport_.setOpaque(true);
// Erstellen des Info-Labels zur Combobox
waehlen_ = new JLabel("Bitte waehlen Sie das anzuzeigende Set aus: ");
setChoiceViewport_.add(BorderLayout.WEST, waehlen_);
// Erstellen der Combobox mit den Setnummern
setChoice_ = new JComboBox();
setChoice_.setPreferredSize(new Dimension(45, 30));
SqlStatement getSetNumbers = new GetSetNumbers();
setsNrs_ = getSetNumbers.getResult(con);
int i = 0;
try {
while (setsNrs_.next()) {
setChoice_.insertItemAt(setsNrs_.getString(1), i);
i++;
}
if (i > 0)
setChoice_.setSelectedIndex(0);
} catch (SQLException x) {
x.printStackTrace();
}
// Combobox mit Setnummern dem Frame hinzufuegen
setChoiceViewport_.add(BorderLayout.EAST, setChoice_);
frame_.getContentPane().add(BorderLayout.NORTH, setChoiceViewport_);
// Erstellen und hinzufuegen der Tabelle mit dem Inhalt des erstellen
// Sets
Object[][] data = {};
contentTable_ = new TableSetView(data);
contentTable_.setOpaque(true); // content panes must be opaque
tableViewport_ = new JPanel();
tableViewport_.setLayout(new BorderLayout());
tableViewport_.setPreferredSize(new Dimension(620, 230));
tableViewport_.setOpaque(true);
tableViewport_.add(contentTable_);
frame_.getContentPane().add(BorderLayout.CENTER, tableViewport_);
//Hinzufuegen des Action Listeners für die ComboBoc weil nun auch die Tabelle existiert
setChoice_.addActionListener(getSetContentListener);
// Erstellen des Info-Labels zum Aendern-Button
aendernViewport_ = new JPanel();
aendernViewport_.setLayout(new BorderLayout());
aendernViewport_.setPreferredSize(new Dimension(600, 50));
aendernViewport_.setOpaque(true);
aendern_ = new JLabel(
"Bitte wählen Sie die zu ändernden Datensätze aus und klicken Sie anschließend auf „Ändern“");
aendernViewport_.add(BorderLayout.NORTH, aendern_);
// Button zum Wechesel zjm naechsten Screen zwecks Änderung von
// Datensätzen
aendernButton_ = new JButton("Ändern");
aendernButton_.addActionListener(getSetContentListener);
aendernViewport_.add(BorderLayout.SOUTH, aendernButton_);
frame_.getContentPane().add(BorderLayout.SOUTH, aendernViewport_);
// Fertigstellen des Frames
frame_.addWindowListener(new FrameController());
frame_.pack();
frame_.setVisible(true);
}
private class getSetContentController implements ActionListener {
public void actionPerformed(ActionEvent anActionEvent) {
try {
SqlStatementWithArgs getSet = new GetSet();
String[] args = { (String) setChoice_.getSelectedItem() };
System.out.println(args[0]);
sets_ = getSet.getResult(con, args);
int j = 0;
if (sets_ != null) {
while (sets_.next()) {
j++;
}
}
Object[][] data = new Object[12][j];
int i = 0;
if (sets_ != null) {
while (sets_.next()) {
data[i][0]= sets_.getString(1);
data[i][1]= new Boolean(false);
data[i][2]= sets_.getString(2);
data[i][3]= sets_.getString(3);
data[i][4]= sets_.getString(4);
data[i][5]= sets_.getString(5);
data[i][6]= sets_.getString(6);
data[i][7]= sets_.getString(7);
data[i][8]= sets_.getString(8);
data[i][9]= sets_.getString(9);
data[i][10]= sets_.getString(10);
data[i][11]= sets_.getString(11);
i++;
}
}
frame_.setVisible(false);
tableViewport_.remove(contentTable_);
contentTable_= new TableSetView(data);
tableViewport_.add(BorderLayout.CENTER, contentTable_);
frame_.setVisible(true);
} catch (IllegalArgumentException x) {
new ExceptionView(frame_, x);
} catch (SQLException x) {
new ExceptionView(frame_, x);
}
}
}
private class FrameController extends WindowAdapter {
public void windowClosing(WindowEvent aWindowEvent) {
aWindowEvent.getWindow().dispose();
}
}
}
Und der Code des Tabellen-Modells:
Code:
package xxx;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
public class TableSetView extends JPanel {
private static final long serialVersionUID = -635949636482015396L;
private JTable table_;
private SetViewTableModel model_ = new SetViewTableModel();
//Erstellen der Tabelle
public TableSetView(Object[][] data) {
model_.setData(data);
table_ = new JTable(model_); // neue Tabelle nach dem SetViewTableModel erstellen
table_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // autm. Größenanpassung der Spalten ausschalten
table_.getTableHeader().setReorderingAllowed(false);
table_.setPreferredScrollableViewportSize(new Dimension(600, 150)); // Darstellungsgröße
int tablesize = table_.getColumnCount(); // Tabellengröße auslesen
// Alle Spalten auf die optimale Breite bringen
for (int i = 0; i < tablesize; i++) {
packColumn(table_, i, 5);
}
// Die Ausrichtung aller Spalten einstellen
table_.setDefaultRenderer(Object.class, new ColumnAlignRenderer());
// Die Ausrichtung aller Header einstellen
renderHeaders();
// Erstellen der Scrollleisten
JScrollPane scrollPane = new JScrollPane(table_,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
add(scrollPane); // die Scrollleisten zur Tabelle hinzufügen
}
// Spalten auf die optimale Breite bringen
public void packColumn(JTable table, int vColIndex, int margin) {
DefaultTableColumnModel colModel = (DefaultTableColumnModel) table
.getColumnModel();
TableColumn col = colModel.getColumn(vColIndex);
int width = 0;
// Get width of column header
TableCellRenderer renderer = col.getHeaderRenderer();
if (renderer == null) {
renderer = table.getTableHeader().getDefaultRenderer();
}
Component comp = renderer.getTableCellRendererComponent(table, col
.getHeaderValue(), false, false, 0, 0);
width = comp.getPreferredSize().width;
// Get maximum width of column data
for (int r = 0; r < table.getRowCount(); r++) {
renderer = table.getCellRenderer(r, vColIndex);
comp = renderer.getTableCellRendererComponent(table, table
.getValueAt(r, vColIndex), false, false, r, vColIndex);
width = Math.max(width, comp.getPreferredSize().width);
}
width += 2 * margin;
col.setPreferredWidth(width);
}
// Header ausrichten
public void renderHeaders() {
HeaderAlignRender header = new HeaderAlignRender();
for (int i = 0; i < 11; i++) {
table_.getColumnModel().getColumn(i).setHeaderRenderer(header);
}
}
public void setData(Object[][] data){
model_.setData(data);
}
public void fireTableDataChanged(){
model_.fireTableDataChanged();
}
// Das Modell für die Tabelle in SetView
private class SetViewTableModel extends AbstractTableModel {
private static final long serialVersionUID = -2313850031325603668L;
private String[] columnNames = { " ConfNr", " Aendern", " im Inventar",
" Verliehen", " PSTNr", " ErzeugnisNr", " ErzeugnisNr2",
" Ueberschrift", " Menge", " Seriennr.", " Kommentar" };
private Object[][] data = { { "116", new Boolean(false), "nein",
"nein", "CUA978", "L30250F 622A978", "L30250-F622-A978",
"Aktivierungsschlüssel für Rest of World", "1", "", "" } };
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col == 1) {
return true;
} else {
return false;
}
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
public Object[][] getData() {
return data;
}
public void setData(Object[][] data) {
this.data = data;
}
}
// Klase zur Ausrichtung aller Spalten in der Tabelle in SetView
private class ColumnAlignRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 3769977988764788794L;
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
if (column == 7 || column == 10)
setHorizontalAlignment(LEFT);
else
setHorizontalAlignment(CENTER);
return this;
}
}
//Klasse zur Ausrichtung aller Header der Tabelle in SetView
private class HeaderAlignRender extends DefaultTableCellRenderer {
private static final long serialVersionUID = -3784038794680191265L;
public Component getTableCellRendererComponent(JTable table,
Object arg1, boolean arg2, boolean arg3, int arg4, int column) {
Component toReturn = table.getTableHeader().getDefaultRenderer()
.getTableCellRendererComponent(table, arg1, arg2, arg3,
arg4, column);
if (column == 7 || column == 10)
((JLabel) toReturn)
.setHorizontalAlignment(DefaultTableCellRenderer.LEFT);
else
((JLabel) toReturn)
.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return toReturn;
}
}
}