Hello,
Just wondered if this was a Swing bug. See also
bug 6349010.
The width of the JToggleButton cannot be set.
However the height can be set.
The important line is line 135 - and also 140.
Try changing the width of the button - it does not change.
thanks,
Anil
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.EventObject;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JToggleButton;
import javax.swing.JTree;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeSelectionModel;
public class TreeUIFailed extends JPanel {
AnilTreeCellRenderer3 atcr;
AnilTreeCellEditor4 atce;
DefaultTreeModel treeModel;
JTree tree;
DefaultMutableTreeNode markedNode = null;
public TreeUIFailed() {
super(new BorderLayout());
treeModel = new DefaultTreeModel(null);
tree = new JTree(treeModel);
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
tree.setCellRenderer(atcr = new AnilTreeCellRenderer3());
tree.setCellEditor(atce = new AnilTreeCellEditor4(tree, atcr));
tree.setRowHeight(0);//TEMP - needed only if setting Win L&F
JScrollPane scrollPane = new JScrollPane(tree);
add(scrollPane,BorderLayout.CENTER);
}
public void setRootNode(DefaultMutableTreeNode node) {
treeModel.setRoot(node);
treeModel.reload();
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException{
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
TreeUIFailed tb = new TreeUIFailed();
tb.setPreferredSize(new Dimension(800,600));
JFrame frame = new JFrame("Tree Windows UI Failed");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(tb);
frame.setSize(800, 600);
frame.pack();
frame.setVisible(true);
tb.populate();
}
private void populate() {
TextAreaNode3 r = new TextAreaNode3(this);
setRootNode(r);
r.gNode.notes.addTab("0", null/* icon */, new JTextArea(2,25),
"no menu!");
r.gNode.notes.addTab("1", null/* icon */, new JTextArea(2,25),
"no menu!");
TextAreaNode3 a = new TextAreaNode3(this);
a.gNode.notes.addTab("1", null/* icon */, new JTextArea(2,25),
"no menu!");
treeModel.insertNodeInto(a, r, r.getChildCount());
}
}
class AnilTreeCellRenderer3 extends DefaultTreeCellRenderer{
TreeUIFailed panel;
DefaultMutableTreeNode currentNode;
public AnilTreeCellRenderer3() {
super();
}
public Component getTreeCellRendererComponent
(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus){
TextAreaNode3 currentNode = (TextAreaNode3)value;
NodeGUI4 gNode = (NodeGUI4) currentNode.gNode;
return gNode.vBox;
}
}
class AnilTreeCellEditor4 extends DefaultTreeCellEditor{
DefaultTreeCellRenderer rend;
public AnilTreeCellEditor4(JTree tree, DefaultTreeCellRenderer r){
super(tree, r);
rend = r;
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row){
return rend.getTreeCellRendererComponent(tree, value, isSelected, expanded,
leaf, row, true);
}
public boolean isCellEditable(EventObject event){
return true;
}
}
/**
* this is done to keep gui separate from model - as in MVC.
* not necessary.
* @author juwo
*
*/
class NodeGUI4 {
JPanel notesPanel = new JPanel(new BorderLayout(), true);
JTabbedPane notes = new JTabbedPane(JTabbedPane.RIGHT);
final TreeUIFailed view;
Box vBox = Box.createVerticalBox();
Box hBox = Box.createHorizontalBox();
final JTextArea textArea = new JTextArea( 1, 5 );
JToggleButton toggleButton = new JToggleButton();
NodeGUI4( TreeUIFailed view_ ) {
this.view = view_;
toggleButton.setAlignmentX(Component.CENTER_ALIGNMENT);
// BEGIN PROBLEM
toggleButton.setPreferredSize(new Dimension(200,toggleButton.getPreferredSize().height));
// END PROBLEM
vBox.add(toggleButton);
vBox.add(hBox);
hBox.add( textArea );
textArea.setBorder( BorderFactory.createMatteBorder( 0, 0, 1, 0, Color.GREEN ) );
notesPanel.add(notes);
hBox.add( notesPanel);
hBox.setBorder( BorderFactory.createMatteBorder( 5, 5, 5, 5, Color.CYAN ) );
// THE FOLLOWING DOES NOT WORK EITHER!!!
// halo.setPreferredSize(new Dimension(vBox.getPreferredSize().width,halo.getPreferredSize().height));
}
}
class TextAreaNode3 extends DefaultMutableTreeNode {
NodeGUI4 gNode;
TextAreaNode3(TreeUIFailed view_t) {
gNode = new NodeGUI4(view_t);
}
}