Swing bug? cannot set width of JToggleButton

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;

publicclass TreeUIFailedextends 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);

}

publicvoid setRootNode(DefaultMutableTreeNode node){

treeModel.setRoot(node);

treeModel.reload();

}

publicstaticvoid 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();

}

privatevoid 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 AnilTreeCellRenderer3extends 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 AnilTreeCellEditor4extends 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);

}

publicboolean isCellEditable(EventObject event){

returntrue;

}

}

/**

* 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 TextAreaNode3extends DefaultMutableTreeNode{

NodeGUI4 gNode;

TextAreaNode3(TreeUIFailed view_t){

gNode =new NodeGUI4(view_t);

}

}

[10099 byte] By [anilp1a] at [2007-10-3 11:24:10]
# 1
Are you using 1.6?
CaptainMorgan08a at 2007-7-15 13:49:46 > top of Java-index,Desktop,Core GUI APIs...
# 2
1.5.0_9That is the latest production release JDK
anilp1a at 2007-7-15 13:49:46 > top of Java-index,Desktop,Core GUI APIs...
# 3

> The important line is line 135 - and also 140.

Your question is about setting the width of a JToggleButton. Why do you need to write a 200 line program to test this?

Write a 10 line program to see if its possible.

Read up on [url http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html]How to Use Layout Managers[/url] to understand how the different Layout Managers, respect or ignore the preferred size suggestion.

camickra at 2007-7-15 13:49:46 > top of Java-index,Desktop,Core GUI APIs...
# 4

ok, sorry!

I understood why it does not work.

Box Layout respects the maximum size of the component.

By default, a JToggleButton is set to 34.

Changing the JToggleButton max width to 75, allows the preferred size to be set.

Thank you camickr!

Note: in contrast, Flow Layout respects the preferred size and ignores the max size!

Message was edited by:

anilp1

anilp1a at 2007-7-15 13:49:46 > top of Java-index,Desktop,Core GUI APIs...