uxilator hat gesagt.:Hallo,
weiß jemand vielleicht wie ich einen Schreibschutz auf eine JTable lege.
SetEnabled(false) kann ich übrigens nicht benutzen da es schon möglich sein soll Zeilen auszuwählen.
Die Zelleninhalte dürfen halt nur nicht verändert werden.
Danke Axel
public boolean isCellEditable(row, col)
...
import javax.swing.*;
import javax.swing.table.*;
import java.util.*;
import java.awt.*;
public class JTable01 {
public static void main(String[] a) {
new JTable01().create();
}
private void create() {
int cols = 9;
int rows = 5;
Vector data = new Vector();
Vector header = new Vector();
header.add("Spalte 1");
header.add("Spalte 2");
header.add("Spalte 3");
header.add("Spalte 4");
header.add("Spalte 5");
header.add("Spalte 6");
header.add("Spalte 7");
header.add("Spalte 8");
header.add("Spalte 9");
TableModel tableModel = new TableModel(data, header);
Object[] objData = new Object[cols];
for (int c = 0; c < cols; c++)
objData[c] = "";
JTable ivjScrollPaneTable = new JTable(tableModel, new ColModel());
for (int c = 0; c < rows; c++)
tableModel.addNewRow(objData);
/*
* ivjScrollPaneTable.setAutoCreateColumnsFromModel(false);
* createColumns(cols,ivjScrollPaneTable);
*/
ivjScrollPaneTable.setAutoCreateColumnsFromModel(true);// entweder diesen oder den
// obigen, auskommentierten
// nehmen
JFrame f = new JFrame();
JPanel p = new JPanel(new BorderLayout());
p.add(new JScrollPane(ivjScrollPaneTable), BorderLayout.CENTER);
f.setContentPane(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p.setPreferredSize(new Dimension(600, 100));
f.setLocation(150, 150);
f.pack();
f.setVisible(true);
}
private void createColumns(int col, JTable ivjScrollPaneTable) {
for (int iCtr = 0; iCtr < col; iCtr++) {
TableColumn column = new TableColumn(iCtr);
column.setPreferredWidth(100);
//column.setHeaderValue((Object) ("Profil " + (iCtr + 1)));
ivjScrollPaneTable.addColumn(column);
}
}
class ColModel extends DefaultTableColumnModel {
public ColModel() {
super();
}
public void addColumn(TableColumn tablcol) {
super.addColumn(tablcol);
}
}
class TableModel extends DefaultTableModel {
public TableModel(Vector data, Vector header) {
super(data, header);
}
public Class getColumnClass(int column) {
return (getValueAt(0, column).getClass());
}
public void addNewRow(Object[] objData) {
addRow(objData);
}
public boolean isCellEditable(int row, int col) {
boolean ret;
if (row > 0)
ret = true;
else
ret = false;
if (ret)
return true;
else
return false;
}
}
}
comp89 hat gesagt.:ich glaube er meinte, man soll die zeile anwählen können (markieren können), um z.b. den inhalt oder so zu bekommen, aber man soll die daten in der tabelle nicht verändern können
das würde mich auch interessieren, das lässt sich auch in mein programm einbauen, früher oder später hätte ich eh gefragt
abollm hat gesagt.:Im Prinzp habe ich dafür schon die Lösung, muss aber noch den Code kurz zusammenbauen, dann poste ich ihn hier, ok?
Anonymous hat gesagt.:...
machst du das jetzt noch?
comp89 hat gesagt.:nein wie geht er,
/*
* Created on 21.12.2004
*
* @author ABollm
*
*/
import javax.swing.*;
import java.awt.*;
import javax.swing.table.*;
import java.util.*;
public class JTableReadOnlyDemo extends JTable {
static String[] names = { "A", "B" };
static Object[][] data = { { "Bleibt stehen, d.h. wird nicht", " aktualisiert nach Verlassen!" },
{ "kann geändert", "werden" },
{ "kann geändert", "werden" },
{ "kann geändert", "werden" },
{ "kann geändert", "werden" }};
static Hashtable hash = new Hashtable();
class myModel extends AbstractTableModel {
public int getColumnCount() {
return names.length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public String getColumnName(int column) {
return names[column];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object aValue, int row, int column) {
String key = new String(row + "|" + column+ " ");
if (hash.get(key) != null) {
System.out.println("Existiert bereits");
hash.remove(key);
hash.put(key, " geändert");
} else {
System.out.println("Erstmals");
hash.put(key, " geändert");
}
if (row >= 1)
data[row][column] = aValue;
System.out.println("Dieser Wert wurde geändert - Zeile: " + row + " - Spalte:" + column);
System.out.println(hash);
}
};
public JTableReadOnlyDemo() {
super(data, names);
dataModel = new myModel();
this.setModel(dataModel);
setRowSelectionAllowed(false);
setCellSelectionEnabled(true);
this.setRowHeight(20);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Demo für Nur-Lesen-Zeile -> Zeile 0");
JTableReadOnlyDemo table = new JTableReadOnlyDemo();
JScrollPane scrollPane = new JScrollPane(table);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
frame.setSize(new Dimension(640, 150));
frame.setVisible(true);
}
}
sry - das halte ich aber nicht für sehr user freundlich... entweder erlaube ich das Ändern oder nicht... Ändern lassen und dann einfach wieder überschreiben find ich sinnlosabollm hat gesagt.:Ich hatte/habe es mir so vorgestellt, dass man die Werte z.B. in der ersten Zeile markieren und damit letztlich auch edieren kann, aber in dem Moment wo man die betr. Zelle verlässt, wird der Ausgangswert wieder in die Zelle geschrieben.
deathbyaclown hat gesagt.:sry - das halte ich aber nicht für sehr user freundlich... entweder erlaube ich das Ändern oder nicht... Ändern lassen und dann einfach wieder überschreiben find ich sinnlosabollm hat gesagt.:Ich hatte/habe es mir so vorgestellt, dass man die Werte z.B. in der ersten Zeile markieren und damit letztlich auch edieren kann, aber in dem Moment wo man die betr. Zelle verlässt, wird der Ausgangswert wieder in die Zelle geschrieben.
Titus hat gesagt.:Die Lösung steht hier:
http://forum.java.sun.com/thread.jspa?forumID=57&threadID=281271
Viele Grüße, Titus