Mahlzeit,
ich habe einen eigenen TreeCellEditor und einen TreeCellRenderer gebaut, welche die Zellen nach meinen Vorstellungen darstellen. Unter Windows funktioniert das alles einwandfrei. Wenn ich das Programm allerdings auf meinem Linux-Mint laufen lasse, sehe ich die Zellen, die der TreeCellEditor darstellen solll nicht.
Hier mal ein laufendes (zusammengekuerztes) Beispielprogramm:
Obwohl der TreeCellRenderer und der TreeCellEditor identisch aufgebaut sind, zeigt der TreeCellEditor (nur unter Linux) nichts an. Wenn ich das Null-Layout in ein Flow-Layout aendere (Zeile 125-127) geht es.
Ich benutze unter Mint folgendes JDK:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)
Hat jemand eine Erklaerung? Was mache ich falsch?
Danke!
Gruss, FFNB.
ich habe einen eigenen TreeCellEditor und einen TreeCellRenderer gebaut, welche die Zellen nach meinen Vorstellungen darstellen. Unter Windows funktioniert das alles einwandfrei. Wenn ich das Programm allerdings auf meinem Linux-Mint laufen lasse, sehe ich die Zellen, die der TreeCellEditor darstellen solll nicht.
Hier mal ein laufendes (zusammengekuerztes) Beispielprogramm:
Java:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.util.EventObject;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
public class TreeTest
{
private JFrame frame;
private JTree jTree;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
TreeTest window = new TreeTest();
window.frame.setVisible(true);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
public TreeTest()
{
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jTree = new JTree();
jTree.setEditable(true);
CheckBoxTreeNodeRenderComponent checkBoxTreeNodeRenderComponent = new CheckBoxTreeNodeRenderComponent();
TestTreeCellRenderer testTreeCellRenderer = new TestTreeCellRenderer(checkBoxTreeNodeRenderComponent);
jTree.setCellRenderer(testTreeCellRenderer);
CheckBoxTreeNodeEditorComponent checkBoxTreeNodeEditorComponent = new CheckBoxTreeNodeEditorComponent();
TestTreeCellEditor testTreeCellEditor = new TestTreeCellEditor(checkBoxTreeNodeEditorComponent);
jTree.setCellEditor(testTreeCellEditor);
frame.add(jTree);
}
public class CheckBoxTreeNodeRenderComponent extends JPanel
{
JCheckBox checkBox = new JCheckBox();
JLabel label = new JLabel();
public CheckBoxTreeNodeRenderComponent()
{
setLayout(null);
add(checkBox);
add(label);
}
@Override
public Dimension getPreferredSize()
{
Dimension d_check = checkBox.getPreferredSize();
Dimension d_label = label.getPreferredSize();
int maxHeight = Math.max(d_check.height, d_label.height);
return new Dimension(d_label.width + d_check.width, maxHeight);
}
@Override
public void validate()
{
Dimension checkBoxDimension = checkBox.getPreferredSize();
Dimension labelDimension = label.getPreferredSize();
int maxHeight = Math.max(checkBoxDimension.height, labelDimension.height);
int y_check = (maxHeight - checkBoxDimension.height)/2;
int y_label = (maxHeight - labelDimension.height)/2;
checkBox.setLocation(0,y_check);
checkBox.setBounds(0,y_check,checkBoxDimension.width,checkBoxDimension.height);
label.setLocation(checkBoxDimension.width,y_label);
label.setBounds(checkBoxDimension.width,y_label,labelDimension.width,labelDimension.height);
}
public JLabel getLabel()
{
return label;
}
}
public class TestTreeCellRenderer extends DefaultTreeCellRenderer
{
CheckBoxTreeNodeRenderComponent checkBoxTreeNodeRenderComponent;
public TestTreeCellRenderer(CheckBoxTreeNodeRenderComponent checkBoxTreeNodeRenderComponent)
{
this.checkBoxTreeNodeRenderComponent = checkBoxTreeNodeRenderComponent;
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus)
{
JLabel label = checkBoxTreeNodeRenderComponent.getLabel();
label.setText(value.toString());
return checkBoxTreeNodeRenderComponent;
}
}
public class CheckBoxTreeNodeEditorComponent extends JPanel
{
JCheckBox checkBox = new JCheckBox();
JTextField textField = new JTextField();
public CheckBoxTreeNodeEditorComponent()
{
// FlowLayout layout = new FlowLayout(FlowLayout.LEADING, 0, 0);
// setLayout(layout);
setLayout(null);
add(checkBox);
add(textField);
}
@Override
public Dimension getPreferredSize()
{
Dimension d_check = checkBox.getPreferredSize();
Dimension d_label = textField.getPreferredSize();
int maxHeight = Math.max(d_check.height, d_label.height);
return new Dimension(d_label.width + d_check.width, maxHeight);
}
@Override
public void validate()
{
Dimension checkBoxDimension = checkBox.getPreferredSize();
Dimension labelDimension = textField.getPreferredSize();
int maxHeight = Math.max(checkBoxDimension.height, labelDimension.height);
int y_check = (maxHeight - checkBoxDimension.height)/2;
int y_label = (maxHeight - labelDimension.height)/2;
checkBox.setLocation(0,y_check);
checkBox.setBounds(0,y_check,checkBoxDimension.width,checkBoxDimension.height);
textField.setLocation(checkBoxDimension.width,y_label);
textField.setBounds(checkBoxDimension.width,y_label,labelDimension.width,labelDimension.height);
}
public JTextField getTextField()
{
return textField;
}
}
public class TestTreeCellEditor implements TreeCellEditor
{
private CheckBoxTreeNodeEditorComponent checkBoxTreeNodeEditorComponent;
public TestTreeCellEditor(CheckBoxTreeNodeEditorComponent checkBoxTreeNodeEditorComponent)
{
this.checkBoxTreeNodeEditorComponent = checkBoxTreeNodeEditorComponent;
}
@Override
public Object getCellEditorValue()
{
return checkBoxTreeNodeEditorComponent.getTextField().getText();
}
@Override
public boolean isCellEditable(EventObject anEvent) {return true;}
@Override
public boolean shouldSelectCell(EventObject anEvent) {return true;}
@Override
public boolean stopCellEditing() {return false;}
@Override
public void cancelCellEditing() {}
@Override
public void addCellEditorListener(CellEditorListener l) {}
@Override
public void removeCellEditorListener(CellEditorListener l) {}
@Override
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row)
{
JTextField textField = checkBoxTreeNodeEditorComponent.getTextField();
textField.setText(value.toString());
return checkBoxTreeNodeEditorComponent;
}
}
}
Obwohl der TreeCellRenderer und der TreeCellEditor identisch aufgebaut sind, zeigt der TreeCellEditor (nur unter Linux) nichts an. Wenn ich das Null-Layout in ein Flow-Layout aendere (Zeile 125-127) geht es.
Ich benutze unter Mint folgendes JDK:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.4) (6b24-1.11.4-1ubuntu0.12.04.1)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)
Hat jemand eine Erklaerung? Was mache ich falsch?
Danke!
Gruss, FFNB.