第7章+插入式界面样式.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流第7章+插入式界面样式.精品文档.第7章 插入式界面样式插入式界面样式是建立在第3章“Swing组件体系结构”中讨论的组件体系结构基础之上的,即一个组件的界面样式是通过把一个特殊的UI代表插入这个组件来设置的。Swing还提供了一个API来管理界面样式。界面样式的管理包括如下几个方面:定义界面样式、指定当前的界面样式和为当前的界面样式添加附加界面样式等。例如,图7-1示出了一个以不同界面样式运行的小应用程序(顺时针方向,从左上开始分别是Metal、Windows、Motif和Macintoch的界面样式)。这个小应用程序提供了一个组合框,用于为该小应用程序的所有组件选取界面样式。这个小应用程序借助Swing的UIManager类,根据在该组合框中的选择安装界面样式(注:未列出图7-1中示出的小应用程序的代码,例7-3给出了一个改变界面样式的例子)。 7.1 插入式界面样式7.1.1 界面样式结构例7-1 一个多行标签import javax.swing.*;import javax.swing.plaf.BorderUIResource;import java.awt.*;import java.awt.event.*;import java.util.*; public class Test extends JApplet public void init() Container contentPane = getContentPane();JLabel label = new JLabel("A long string that is high on verbiage and " +"low on content.");MultilineLabel multilineLabel = new MultilineLabel("A long string that is high on verbiage and " +"low on content."); contentPane.setLayout(new BorderLayout(2,10);contentPane.add(label, BorderLayout.NORTH);contentPane.add(multilineLabel, BorderLayout.CENTER);class MultilineLabel extends JTextArea public MultilineLabel(String s) super(s);public void updateUI() super.updateUI();/ turn on wrapping and disable editing and highlightingsetLineWrap(true);setWrapStyleWord(true);setHighlighter(null);setEditable(false);/ Set the text area's border, colors and font to/ that of a labelLookAndFeel.installBorder(this, "Label.border");LookAndFeel.installColorsAndFont(this, "Label.background", "Label.foreground","Label.font");7.1.2 界面样式缺省值例7-2 修改UI缺省值import java.awt.Color;import javax.swing.*; public class Test extends JApplet public void init() UIManager.put("Tree.background", Color.lightGray);UIManager.put("Tree.textBackground", Color.lightGray);/ScrollBar.width is peculiar to Metal L&FUIManager.put("ScrollBar.width", new Integer(25);getContentPane().add(new JScrollPane(new JTree();7.1.3 UI管理器例7-3 变换一个组件树的界面样式import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*; import com.sun.java.swing.plaf.motif.MotifLookAndFeel;import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;import javax.swing.plaf.metal.MetalLookAndFeel;import javax.swing.plaf.ColorUIResource;public class Test extends JApplet public void init() Container contentPane = getContentPane();contentPane.add(new ControlPanel(), BorderLayout.NORTH);contentPane.add(new ComponentPanel(), BorderLayout.CENTER);class ComponentPanel extends JPanel public ComponentPanel() JList list;JScrollBar sb;setBorder(BorderFactory.createTitledBorder("Components");add(new JCheckBox("check Me");add(new JRadioButton("radio button");add(new JButton("button");add(new JLabel("A Label:");add(new JTextField("text field");add(new JScrollPane(list = new JList(new Object "item 1", "item 2", "item 3","item 4", "item 5", "item 6","item 7", "item 8", "item 9",);add(sb = new JScrollBar(SwingConstants.HORIZONTAL);sb.setPreferredSize(new Dimension(150,17);add(sb = new JScrollBar(SwingConstants.VERTICAL);sb.setPreferredSize(new Dimension(20,175);list.setVisibleRowCount(5);class ControlPanel extends JPanel JCheckBox checkBox = new JCheckBox("UIResource");JRadioButton motifButton = new JRadioButton("Motif"),windowsButton = new JRadioButton("Windows"),metalButton = new JRadioButton("Metal");public ControlPanel() ActionListener listener = new RadioHandler();ButtonGroup group = new ButtonGroup();group.add(motifButton);group.add(windowsButton);group.add(metalButton);motifButton.addActionListener(listener);windowsButton.addActionListener(listener);metalButton.addActionListener(listener);add(motifButton);add(windowsButton);add(metalButton);class RadioHandler implements ActionListener public void actionPerformed(ActionEvent e) JRadioButton src = (JRadioButton)e.getSource();try if(src = motifButton)UIManager.setLookAndFeel("com.sun.java.swing.plaf." +"motif.MotifLookAndFeel");else if(src = windowsButton)UIManager.setLookAndFeel("com.sun.java.swing.plaf." +"windows.WindowsLookAndFeel");else if(src = metalButton)UIManager.setLookAndFeel("javax.swing.plaf.metal." +"MetalLookAndFeel");catch(Exception ex) ex.printStackTrace();SwingUtilities.updateComponentTreeUI(getContentPane();7.1.4 UI资源例7-4 UI资源import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*; import com.sun.java.swing.plaf.motif.MotifLookAndFeel;import javax.swing.plaf.metal.MetalLookAndFeel;import javax.swing.plaf.ColorUIResource;public class Test extends JApplet private JButton button = new JButton("App Resource");public void init() Container contentPane = getContentPane();contentPane.add(new ControlPanel(), BorderLayout.NORTH);contentPane.add(button, BorderLayout.CENTER);class ControlPanel extends JPanel boolean resource = false;JButton colorSetButton = new JButton("Set Color .");JCheckBox checkBox = new JCheckBox("UIResource");JRadioButton motifButton = new JRadioButton("Motif"),metalButton = new JRadioButton("Metal");public ControlPanel() ActionListener listener = new RadioHandler();ButtonGroup group = new ButtonGroup();group.add(motifButton);group.add(metalButton);motifButton.addActionListener(listener);metalButton.addActionListener(listener);metalButton.setSelected(true);add(motifButton);add(metalButton);add(Box.createHorizontalStrut(25);add(colorSetButton);add(checkBox);Font buttonFont = button.getFont();button.setFont(new Font(buttonFont.getFamily(),Font.ITALIC, 56);colorSetButton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) updateButtonColor(););checkBox.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) resource = checkBox.isSelected();updateButtonColor(););private void updateButtonColor() Color c = JColorChooser.showDialog(getContentPane(), / parent component"Choose a Color", / titlegetBackground(); / initial colorif(resource) button.setText("UI Resource");button.setForeground(new ColorUIResource(c);else button.setText("App Resource");button.setForeground(c);class RadioHandler implements ActionListener public void actionPerformed(ActionEvent e) JRadioButton src = (JRadioButton)e.getSource();try if(src = motifButton)UIManager.setLookAndFeel("com.sun.java.swing.plaf." +"motif.MotifLookAndFeel");else if(src = metalButton)UIManager.setLookAndFeel("javax.swing.plaf.metal." +"MetalLookAndFeel");catch(Exception ex) ex.printStackTrace();SwingUtilities.updateComponentTreeUI(getContentPane();7.2 Java界面样式例7-5 Metal客户属性import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*; public class Test extends JApplet JDesktopPane desktopPane = new JDesktopPane();JInternalFrame jif = new JInternalFrame("Internal Frame ", / titletrue, / resizabletrue, / closabletrue, / maximizabletrue); / iconifiableJScrollBar scrollbar = new JScrollBar();JSlider slider = new JSlider();JToolBar toolbar = new JToolBar();JTree tree = new JTree();public void init() Container contentPane = getContentPane();jif.setPreferredSize(new Dimension(550, 450);jif.getContentPane().setLayout(new FlowLayout();jif.getContentPane().add(new ComponentPanel();desktopPane.setLayout(new FlowLayout();desktopPane.add(jif);contentPane.add(new ControlPanel(), BorderLayout.NORTH);contentPane.add(desktopPane, BorderLayout.CENTER);class ComponentPanel extends JPanel public ComponentPanel() JPanel panel = new JPanel();setLayout(new BorderLayout();add(toolbar, BorderLayout.NORTH);add(panel, BorderLayout.CENTER);panel.add(scrollbar);panel.add(slider);panel.add(new JScrollPane(tree);tree.setPreferredSize(new Dimension(200,100);toolbar.add(new JButton("button");class ControlPanel extends JPanel JCheckBox rollover = new JCheckBox("JToolBar.rollover");JCheckBox palette = new JCheckBox("JInternalFrame.palette");JCheckBox filled = new JCheckBox("JSlider.isFilled");JCheckBox freeStanding = new JCheckBox(" JScrollBar.freeStanding");JRadioButton none = new JRadioButton("none");JRadioButton horizontal = new JRadioButton("horizontal");JRadioButton angled = new JRadioButton("angled");public ControlPanel() ActionListener checkBoxListener = new CheckBoxListener();ActionListener radioButtonListener = new RadioButtonListener();palette.addActionListener(checkBoxListener);filled.addActionListener(checkBoxListener);rollover.addActionListener(checkBoxListener);freeStanding.addActionListener(checkBoxListener);none.addActionListener(radioButtonListener);horizontal.addActionListener(radioButtonListener);angled.addActionListener(radioButtonListener);ButtonGroup group = new ButtonGroup();group.add(none);group.add(horizontal);group.add(filled);none.setSelected(true);freeStanding.setSelected(true);add(palette);add(filled);add(rollover);add(freeStanding);add(Box.createHorizontalStrut(10);add(new JLabel("Tree: ");add(none);add(horizontal);add(angled);class RadioButtonListener implements ActionListener public void actionPerformed(ActionEvent e) JRadioButton rb = (JRadioButton)e.getSource();if(rb = none) tree.putClientProperty("JTree.lineStyle", "None");if(rb = horizontal) tree.putClientProperty("JTree.lineStyle", "Horizontal");if(rb = angled) tree.putClientProperty("JTree.lineStyle", "Angled");tree.repaint();class CheckBoxListener implements ActionListener public void actionPerformed(ActionEvent e) JCheckBox cb = (JCheckBox)e.getSource();if(cb = palette) palette.putClientProperty("JInternalFrame.isPalette", new Boolean(cb.isSelected();jif.revalidate();else if(cb = filled) slider.putClientProperty("JSlider.isFilled", new Boolean(cb.isSelected();slider.repaint();else if(cb = rollover) toolbar.putClientProperty("JToolBar.isRollover", new Boolean(cb.isSelected();toolbar.repaint();else if(cb = freeStanding) scrollbar.putClientProperty("JScrollBar.isFreeStanding", new Boolean(cb.isSelected();scrollbar.repaint();7.2.1 客户属性7.2.2 主题例7-6 一个简单的定制主题import java.awt.*;import javax.swing.*;import javax.swing.plaf.*;import javax.swing.plaf.metal.*;import javax.swing.plaf.*; public class Test extends JApplet public void init() Container contentPane = getContentPane();contentPane.setLayout(new FlowLayout();setMetalTheme(new ExperimentalTheme();contentPane.add(new JButton("button");contentPane.add(new JCheckBox("check me");private void setMetalTheme(MetalTheme theme) MetalLookAndFeel.setCurrentTheme(new ExperimentalTheme();/ Metal Look and Feel must be (re)loaded for the/ new theme to take effect .try UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");catch(IllegalAccessException e1) catch(UnsupportedLookAndFeelException e2) catch(InstantiationException e3) catch(ClassNotFoundException e4) class ExperimentalTheme extends DefaultMetalTheme public FontUIResource getControlTextFont() return new FontUIResource("SanSerif", Font.BOLD + Font.ITALIC, 24);例7-7 安装一个附加界面样式import java.awt.*;import javax.swing.*; public class Test extends JApplet public void init() UIManager.addAuxiliaryLookAndFeel( new ExampleAuxiliaryLookAndFeel();Container contentPane = getContentPane();JButton button = new JButton("button");contentPane.setLayout(new FlowLayout();contentPane.add(button);例7-8 附加界面样式的例子import java.awt.*;import javax.swing.*; public class ExampleAuxiliaryLookAndFeel extends LookAndFeel public String getDescription()return "example auxiliary look and feel"public String getID() return "example"public String getName() return "example auxiliary" public boolean isNativeLookAndFeel() return false;public boolean isSupportedLookAndFeel() return true;public UIDefaults getDefaults() UIDefaults table = new UIDefaults();Object uiDefaults = "ButtonUI", "AuxiliaryButtonUI"table.putDefaults(uiDefaults);return table;例7-9 一个附加UIimport java.awt.*;import java.awt.event.*;import javax.accessibility.*;import javax.swing.*;import javax.swing.plaf.*; public class AuxiliaryButtonUI extends ComponentUI private static ComponentUI cui = new AuxiliaryButtonUI();private static AuxiliaryButtonMouseListener ml = new AuxiliaryButtonMouseListener();/ must be implementedpublic static ComponentUI createUI(JComponent c) return cui;public void installUI(JComponent c) c.addMouseListener(ml);public void uninstallUI(JComponent c) c.removeMouseListener(ml);public void update(Graphics g, JComponent c) / don't want ComponentUI default behavior, which is/ to clear the backgroundclass AuxiliaryButtonMouseListener extends MouseAdapter public void mouseEntered(MouseEvent e) JComponent c = (JComponent)e.getSource();AccessibleContext ac = c.getAccessibleContext();String role = ac.getAccessibleRole().toString();String name = ac.getAccessibleName();System.out.println("mouse entered component of type " +role + " named " + name);