shutdown
Erfahrenes Mitglied
Hi!
Ich hätte da mal ein Problem, zu dem ich im Netz nicht so richtig was finde.
Es gibt ja verschiedene Tutorials zum dem Thema TreeTables in Java (aus JTree und JTable).
- Seltsamerweise funktioniert bei mir kein einziges der Code-Beispiele, aber ok.
Jedenfalls habe ich das jetzt mal bei mir nachvollzogen und nach diesen Beispielen einen TreeTable gebaut.
Allerdings habe ich jetzt das Problem, dass keine Mausaktionen, die ich vornehme, an den JTree weitergeleitet werden - mit anderen Worten, will ich den Tree expandieren oder kollabieren lassen, dann passiert nichts.
Nach meinem bisherigen Verständnis ist ein Renderer in Swing tatsächlich auch nur zum Darstellen dar und gibt daher auch gar keine Events an innere Komponenten weiter - zumindest dachte ich das bisher, lt. den Tutorials muss man ja keinen Cell-Editor schreiben um den Tree tatsächlich direkt anzusprechen.
Jedenfalls habe ich nun genau das Verhalten, dass der Tree nicht angesprochen wird.
Wenn sich jemand schon mal damit beschäftigt hat, wäre ich für jede Hilfe dankbar.
cu shutdown
Hier mein Code:
Ich hätte da mal ein Problem, zu dem ich im Netz nicht so richtig was finde.
Es gibt ja verschiedene Tutorials zum dem Thema TreeTables in Java (aus JTree und JTable).
- Seltsamerweise funktioniert bei mir kein einziges der Code-Beispiele, aber ok.
Jedenfalls habe ich das jetzt mal bei mir nachvollzogen und nach diesen Beispielen einen TreeTable gebaut.
Allerdings habe ich jetzt das Problem, dass keine Mausaktionen, die ich vornehme, an den JTree weitergeleitet werden - mit anderen Worten, will ich den Tree expandieren oder kollabieren lassen, dann passiert nichts.
Nach meinem bisherigen Verständnis ist ein Renderer in Swing tatsächlich auch nur zum Darstellen dar und gibt daher auch gar keine Events an innere Komponenten weiter - zumindest dachte ich das bisher, lt. den Tutorials muss man ja keinen Cell-Editor schreiben um den Tree tatsächlich direkt anzusprechen.
Jedenfalls habe ich nun genau das Verhalten, dass der Tree nicht angesprochen wird.
Wenn sich jemand schon mal damit beschäftigt hat, wäre ich für jede Hilfe dankbar.
cu shutdown
Hier mein Code:
Code:
import java.awt.Component;
import java.awt.Graphics;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreeSelectionModel;
public class JTreeTable extends JTable {
private TreeTableRenderer tree;
private TreeTableModel model;
public JTreeTable() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
root.add(new DefaultMutableTreeNode("sub"));
root.add(new DefaultMutableTreeNode("subbie2"));
DefaultMutableTreeNode subbie3 = new DefaultMutableTreeNode("subbi3");
root.add(subbie3);
subbie3.add(new DefaultMutableTreeNode("hallo"));
tree = new TreeTableRenderer(root);
model = new TreeTableModel(tree);
setModel(model);
setDefaultRenderer(TreeTableRenderer.class, tree);
setShowGrid(false);
tree.expandRow(tree.getRowCount()-1);
}
@Override
public void updateUI() {
super.updateUI();
if(tree != null)
tree.updateUI();
}
public JTreeTable(Object[][] rowData, Object[] columnNames) {
super(rowData, columnNames);
// TODO Auto-generated constructor stub
}
public int getEditingRow() {
if (getColumnClass(editingColumn) == TreeTableRenderer.class)
return -1;
return editingRow;
}
class TreeTableRenderer extends JTree implements TableCellRenderer {
private int visibleRow;
public TreeTableRenderer(TreeNode root) {
super(root);
setSelectionModel(new DefaultTreeSelectionModel());
}
@Override
public void paint(Graphics g) {
g.translate(0, -visibleRow * getRowHeight());
super.paint(g);
}
@Override
public void setBounds(int x, int y, int width, int height) {
super.setBounds(x, 0, width, JTreeTable.this.getHeight());
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
visibleRow = row;
return this;
}
}
class TreeTableModel extends DefaultTableModel {
private JTree tree;
private String[] headers = new String[] { "node", "id", "sonstwas" };
public TreeTableModel(JTree tree) {
this.tree = tree;
}
@Override
public int getRowCount() {
if (tree == null)
return 0;
return tree.getRowCount();
}
@Override
public Object getValueAt(int row, int column) {
if (column == 0)
return tree;
else
return "1";
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
if (columnIndex == 0)
return tree.getClass();
return getValueAt(0, columnIndex).getClass();
}
@Override
public int getColumnCount() {
return headers.length;
}
@Override
public String getColumnName(int column) {
return headers[column];
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) { e.printStackTrace(); }
JFrame f = new JFrame();
f.setSize(300, 400);
f.add(new JTreeTable(
// new Object[][] {
// {"asd", "safd"},
// {"sadjfl", "lsadjfasdf"}
// }, new String[] {"nr", "sonstwas"}
));
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}