Hallo,
ich füge in einem JTable per Button Zeilen hinzu. Mann kann dann den Inhalt eintippen. Soweit so gut. Leider muß man, damit die Änderung wirksam wird, innerhalb der Tabelle auf ein Feld klicken, sonst bleibt intern der alte Wert im Model stehen.
In meiner Applikation möchte ich die Änderungn übernehmen, ohne noch irgendwo in einer andere Zelle zu clicken.
Ich habe mal versucht ein möglichst kleines Beispiel zu schreiben. Das ist nicht schön, soll nur zeigen was ich meine.
Zum Testen: Einfach ein paar mal den Button "Add" drücken. Dann in irgendeine Zeile gehen und den Inhalt editieren. Dann Print drücken und auf der Konsole schauen was ich bekomme. Es wird nicht der neue Inhalt der Zeile ausgegeben, sondern der alte.
Wie kann ich das ändern?
Viele Grüße, Lars
ich füge in einem JTable per Button Zeilen hinzu. Mann kann dann den Inhalt eintippen. Soweit so gut. Leider muß man, damit die Änderung wirksam wird, innerhalb der Tabelle auf ein Feld klicken, sonst bleibt intern der alte Wert im Model stehen.
In meiner Applikation möchte ich die Änderungn übernehmen, ohne noch irgendwo in einer andere Zelle zu clicken.
Ich habe mal versucht ein möglichst kleines Beispiel zu schreiben. Das ist nicht schön, soll nur zeigen was ich meine.
Zum Testen: Einfach ein paar mal den Button "Add" drücken. Dann in irgendeine Zeile gehen und den Inhalt editieren. Dann Print drücken und auf der Konsole schauen was ich bekomme. Es wird nicht der neue Inhalt der Zeile ausgegeben, sondern der alte.
Wie kann ich das ändern?
Viele Grüße, Lars
Code:
package jtablemouselistener;
/*
* TableDemo.java requires no other files.
*/
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
/**
* TableDemo is just like SimpleTableDemo, except that it uses a custom
* TableModel.
*/
public class AddTable extends JPanel {
private boolean DEBUG = false;
private JTable table;
private JButton btnAdd;
private JButton btnPrint;
public AddTable() {
super(new GridLayout(2, 0));
table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
add(buildButtons());
}
public void setTableMOdel(MyTableModel test) {
table = new JTable(test);
}
private Component buildButtons() {
JPanel panel = new JPanel();
btnAdd = new JButton("Add");
btnAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
addRow();
}
});
btnPrint = new JButton("Print");
btnPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
TableModel model = table.getModel();
for (int i = 0; i < model.getRowCount(); i++) {
System.out.println(model.getValueAt(i, 0));
}
}
});
panel.add(btnAdd);
panel.add(btnPrint);
return panel;
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = { "First Name" };
private ArrayList<String> data = new ArrayList<String>();
public void setData(ArrayList<String> test) {
data = test;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data.get(row);
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
if (data.size() > row) {
data.set(row, (String) value);
} else
data.add((String) value);
fireTableDataChanged();
}
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
AddTable newContentPane = new AddTable();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
protected void addRow() {
TableModel model = table.getModel();
int num = model.getRowCount();
model.setValueAt("Test", num+1, 1);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}