|
Description
|
FULL PRODUCT VERSION :
java version "1.4.1"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1-b21)
Java HotSpot(TM) Client VM (build 1.4.1-b21, mixed mode)
FULL OPERATING SYSTEM VERSION :
SunOS wind 5.7 Generic_106541-23 sun4u sparc SUNW,Ultra-60
A DESCRIPTION OF THE PROBLEM :
I ran your new swing demos that show off 1.4 features. In
particular I ran the ActionDemo located here:
http://java.sun.com/docs/books/tutorialJWS/uiswing/misc/example-1dot4/ActionDemo.jnlp
It launches just fine and correctly uses the Metal look and
feel for the top level window dressing, however if I grab
the toolbar and detatch it such that it creates a top level
shell you will notice that it ignores the
setDefaultLookAndFeelDecorated hint given to the top level
frame and displays the shell using the Motif window
dressings. This looks really bizzar.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Load the following link with Java Web Start
http://java.sun.com/docs/books/tutorialJWS/uiswing/misc/example-1dot4/ActionDemo.jnlp
2. Grab the toolbar handle and tear it off the application
so that it floats in it's own top level shell.
3. Note that the window dressing is the native one instead
of using the Metal look and feel like the top level frame did.
EXPECTED VERSUS ACTUAL BEHAVIOR :
I expected all child shells to use the same hint as the top
level frame from which it came.
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
/*
* This relies on having the Java Look and Feel Graphics Repository
* (jlfgr-1_0.jar) in the class path. You can download this file
* from http://developer.java.sun.com/developer/techDocs/hi/repository/.
* Put it in the class path using one of the following commands
* (assuming jlfgr-1_0.jar is in a subdirectory named jars):
*
* java -cp .;jars/jlfgr-1_0.jar ActionDemo [ customer Windows]
* java -cp .:jars/jlfgr-1_0.jar ActionDemo [UNIX]
*
* I needed to put quotation marks around the path, since I use a
* UNIX-emulating shell on Win32:
*
* java -cp ".;jars/jlfgr-1_0.jar" ActionDemo [UNIX shell on Win32]
*/
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JToolBar;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
public class ActionDemo extends JPanel
implements ItemListener {
protected JTextArea textArea;
protected String newline = "\n";
protected Action leftAction, middleAction, rightAction;
protected JCheckBoxMenuItem[] cbmi;
public ActionDemo() {
//Create a scrolled text area.
textArea = new JTextArea(5, 30);
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
//Lay out the content pane.
setLayout(new BorderLayout());
setPreferredSize(new Dimension(450, 150));
add(scrollPane, BorderLayout.CENTER);
//Create the actions shared by the toolbar and menu.
leftAction = new LeftAction( "Go left",
createNavigationIcon("Back24"),
"This is the left button.",
new Integer(KeyEvent.VK_L));
middleAction = new MiddleAction("Do something",
createNavigationIcon("Up24"),
"This is the middle button.",
new Integer(KeyEvent.VK_M));
rightAction = new RightAction( "Go right",
createNavigationIcon("Forward24"),
"This is the right button.",
new Integer(KeyEvent.VK_R));
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createNavigationIcon(String imageName) {
String imgLocation = "toolbarButtonGraphics/navigation/"
+ imageName
+ ".gif";
java.net.URL imageURL = ActionDemo.class.getResource(imgLocation);
if (imageURL == null) {
System.err.println("Resource not found: "
+ imgLocation);
return null;
} else {
return new ImageIcon(imageURL);
}
}
public JMenuBar createMenuBar() {
JMenuItem menuItem = null;
JMenuBar menuBar;
//Create the menu bar.
menuBar = new JMenuBar();
//Create the first menu.
JMenu mainMenu = new JMenu("Menu");
Action[] actions = {leftAction, middleAction, rightAction};
for (int i = 0; i < actions.length; i++) {
menuItem = new JMenuItem(actions[i]);
menuItem.setIcon(null); //arbitrarily chose not to use icon
mainMenu.add(menuItem);
}
//Set up the menu bar.
menuBar.add(mainMenu);
menuBar.add(createAbleMenu());
return menuBar;
}
public void createToolBar() {
JButton button = null;
//Create the toolbar.
JToolBar toolBar = new JToolBar();
add(toolBar, BorderLayout.PAGE_START);
//first button
button = new JButton(leftAction);
if (button.getIcon() != null) {
button.setText(""); //an icon-only button
}
toolBar.add(button);
//second button
button = new JButton(middleAction);
if (button.getIcon() != null) {
button.setText(""); //an icon-only button
}
toolBar.add(button);
//third button
button = new JButton(rightAction);
if (button.getIcon() != null) {
button.setText(""); //an icon-only button
}
toolBar.add(button);
}
protected JMenu createAbleMenu() {
JMenu ableMenu = new JMenu("Action State");
cbmi = new JCheckBoxMenuItem[3];
cbmi[0] = new JCheckBoxMenuItem("First action enabled");
cbmi[1] = new JCheckBoxMenuItem("Second action enabled");
cbmi[2] = new JCheckBoxMenuItem("Third action enabled");
for (int i = 0; i < cbmi.length; i++) {
cbmi[i].setSelected(true);
cbmi[i].addItemListener(this);
ableMenu.add(cbmi[i]);
}
return ableMenu;
}
public void itemStateChanged(ItemEvent e) {
JCheckBoxMenuItem mi = (JCheckBoxMenuItem)(e.getSource());
boolean selected =
(e.getStateChange() == ItemEvent.SELECTED);
//Set the enabled state of the appropriate Action.
if (mi == cbmi[0]) {
leftAction.setEnabled(selected);
} else if (mi == cbmi[1]) {
middleAction.setEnabled(selected);
} else if (mi == cbmi[2]) {
rightAction.setEnabled(selected);
}
}
public void displayResult(String actionDescription,
ActionEvent e) {
String s = ("Action event detected: "
+ actionDescription
+ newline
+ " Event source: " + e.getSource()
+ newline);
textArea.append(s);
}
public class LeftAction extends AbstractAction {
public LeftAction(String text, ImageIcon icon,
String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
displayResult("Action for first button/menu item", e);
}
}
public class MiddleAction extends AbstractAction {
public MiddleAction(String text, ImageIcon icon,
String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
displayResult("Action for second button/menu item", e);
}
}
public class RightAction extends AbstractAction {
public RightAction(String text, ImageIcon icon,
String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
displayResult("Action for third button/menu item", e);
}
}
public static void main(String[] args) {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("ActionDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create/set menu bar and content pane.
ActionDemo demo = new ActionDemo();
frame.setJMenuBar(demo.createMenuBar());
demo.createToolBar();
frame.setContentPane(demo);
//Display the window.
frame.pack();
frame.setVisible(true);
}
}
---------- END SOURCE ----------
(Review ID: 179103)
======================================================================
Posted Date : 2005-09-09 20:08:14.0
|