LayoutManager Null-Layout unter Linux im TreeCellEditor

FerFemNemBem

Bekanntes Mitglied
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:

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.
 

FerFemNemBem

Bekanntes Mitglied
Mahlzeit,

Ich loese mal auf (vielleicht interessiert es ja den ein oder anderen)...

warum auch immer - die "validate()"-Methode der Editor-Komponente wird unter Linux nicht "automatisch" aufgerufen. Somit haben die Komponenten auf dem Panel keine Groesse und Position und werden auf 'nem Null-Layout nicht dargestellt.

Unter Windows ist der CallStack fuer die "validate()"-Methode der Editor-Komponente folgender:

Code:
java.lang.Exception
	at TreeTest$CheckBoxTreeNodeEditorComponent.validate(TreeTest.java:147)
	at javax.swing.plaf.basic.BasicTreeUI.startEditing(BasicTreeUI.java:2078)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3519)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3459)
	at java.awt.Component.processMouseEvent(Component.java:6287)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6055)
	at java.awt.Container.processEvent(Container.java:2039)
	at java.awt.Component.dispatchEventImpl(Component.java:4653)
	at java.awt.Container.dispatchEventImpl(Container.java:2097)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4233)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
	at java.awt.Container.dispatchEventImpl(Container.java:2083)
	at java.awt.Window.dispatchEventImpl(Window.java:2482)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:648)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:607)
	at java.awt.EventQueue$1.run(EventQueue.java:605)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:621)
	at java.awt.EventQueue$2.run(EventQueue.java:619)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:618)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Keine Ahnung, wo hier plattformabhaengiges passiert.

Die Loesung ist, zwischen Zeile 194 und 195:
Java:
checkBoxTreeNodeEditorComponent.validate();
einzufuegen.

Gruss, FFNB.
 

bERt0r

Top Contributor
Genau deshalb (siehe link in Signatur) ist Null layout böse. Anstatt deiner validate Methode kannst du diesen Code auf genausogut in einen eigenen Layoutmanager schreiben und dann läuft das überall.
 

FerFemNemBem

Bekanntes Mitglied
Mahlzeit,

super Idee! Ich hab mir nun einen eigenen LayoutManager geschrieben, der die "layoutContainer(Container parent)" und "preferredLayoutSize(Container parent)" Methoden entsprechend meiner "getPreferredSize()" und "validate()" Methoden implementiert... funktioniert prima und war gar nicht so kompliziert.

Danke!

Gruss, FFNB.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
J JScrollPane & Null-Layout AWT, Swing, JavaFX & SWT 12
A JPanel mit Layout(null) in JPanel AWT, Swing, JavaFX & SWT 4
H null Layout -> Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
G Probleme mit Content bei Null-Layout verändern AWT, Swing, JavaFX & SWT 7
T Null Layout Problem. AWT, Swing, JavaFX & SWT 3
I Null-Layout-Problem AWT, Swing, JavaFX & SWT 2
M Problem mit NULL-Layout AWT, Swing, JavaFX & SWT 2
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
B NULL Layout - TextFelder verschwinden AWT, Swing, JavaFX & SWT 8
F Scrollen bei JTextArea in einem Null-Layout? Unmöglich? AWT, Swing, JavaFX & SWT 4
R Komponenten frei per Drag&Drop in (z.B.) Null-Layout bew AWT, Swing, JavaFX & SWT 2
B [Swing] Null-Layout AWT, Swing, JavaFX & SWT 2
G Scrollpane in null-Layout einfügen AWT, Swing, JavaFX & SWT 5
W Probleme mit Border- und null-Layout AWT, Swing, JavaFX & SWT 8
Z textField.getText = null AWT, Swing, JavaFX & SWT 15
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
AmsananKING Textfelder sind gleich null AWT, Swing, JavaFX & SWT 2
J Injection - Aber Controller sind null AWT, Swing, JavaFX & SWT 3
J Controller ist null - Warum AWT, Swing, JavaFX & SWT 3
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
N SceneBuilder wie auf Attribute zugreifen? Diese sind immer null. AWT, Swing, JavaFX & SWT 6
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
D Zwischen Null-Layouts wechseln AWT, Swing, JavaFX & SWT 2
S Unverstandene Null.PointException AWT, Swing, JavaFX & SWT 4
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
G Swing, JavaFx - Felder aus FXML sind null AWT, Swing, JavaFX & SWT 6
K Swing JSpinner mit NULL AWT, Swing, JavaFX & SWT 3
F JavaFX Properties und NULL Werte AWT, Swing, JavaFX & SWT 2
M JTextField gibt beim auslesen null aus AWT, Swing, JavaFX & SWT 9
S String is null Fehler AWT, Swing, JavaFX & SWT 2
R Swing JLabel gibt stets 'null' aus AWT, Swing, JavaFX & SWT 3
P Swing JTable null values an das Ende verschieben AWT, Swing, JavaFX & SWT 2
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
C JTable sorter GregorianCalender null Exc AWT, Swing, JavaFX & SWT 4
N Swing JFrame==null und doch nicht null?! AWT, Swing, JavaFX & SWT 4
N JButton Border(null) AWT, Swing, JavaFX & SWT 3
K Swing regexFilter() null filtern AWT, Swing, JavaFX & SWT 3
R Swing JComboBox - Null-Feld AWT, Swing, JavaFX & SWT 7
M SWT DateTime per default null Wert ? AWT, Swing, JavaFX & SWT 3
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
G Zentrieren mittels setLocationRelativeTo(null);? AWT, Swing, JavaFX & SWT 14
G Value vom TreeCellEditor ist immer null AWT, Swing, JavaFX & SWT 3
G JTree Problem: Null Child not allowed AWT, Swing, JavaFX & SWT 12
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
C getGraphics() liefert nur null AWT, Swing, JavaFX & SWT 4
M JFormattedTextField und Null-Werte AWT, Swing, JavaFX & SWT 4
S Text im JLabel wird nicht als null anerkannt AWT, Swing, JavaFX & SWT 4
P paint null pointer exception AWT, Swing, JavaFX & SWT 3
G null pointer mit getText AWT, Swing, JavaFX & SWT 2
V CellEditor der nur Eingaben int 1-9 und "null" er AWT, Swing, JavaFX & SWT 11
H getGraphics() eines JPanel liefert immer null zurück AWT, Swing, JavaFX & SWT 6
F PanelBounds an TextPaneBounds anpassen LayoutManager: Null AWT, Swing, JavaFX & SWT 2
A Null pointer exception beim Neuzeichnen AWT, Swing, JavaFX & SWT 4
M bei filechooser.showSaveDialog(null); auf Datein. zugreifen AWT, Swing, JavaFX & SWT 2
V Null Pointer Exception bei JTextField setText AWT, Swing, JavaFX & SWT 25
G JList: Anzeige von null-Werten verhindern AWT, Swing, JavaFX & SWT 3
Z createImage() liefert null zurück AWT, Swing, JavaFX & SWT 4
K JTextArea und setLayout(null) AWT, Swing, JavaFX & SWT 3
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben