《第7章+插入式界面样式.doc》由会员分享,可在线阅读,更多相关《第7章+插入式界面样式.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流第7章+插入式界面样式.精品文档.第7章 插入式界面样式插入式界面样式是建立在第3章“Swing组件体系结构”中讨论的组件体系结构基础之上的,即一个组件的界面样式是通过把一个特殊的UI代表插入这个组件来设置的。Swing还提供了一个API来管理界面样式。界面样式的管理包括如下几个方面:定义界面样式、指定当前的界面样式和为当前的界面样式添加附加界面样式等。例如,图7-1示出了一个以不同界面样式运行的小应用程序(顺时针方向,从左上开始分别是Metal、Windows、Motif和Macintoch的界面样式)。这个小应用程序提供了一个组合框,用于
2、为该小应用程序的所有组件选取界面样式。这个小应用程序借助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 pu
3、blic 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,1
4、0);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);setWrapS
5、tyleWord(true);setHighlighter(null);setEditable(false);/ Set the text areas 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;im
6、port 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(ne
7、w 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.p
8、laf.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;
9、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, i
10、tem 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
11、 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(windowsB
12、utton);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) JRadioB
13、utton 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(ja
14、vax.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 j
15、avax.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(butt
16、on, 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() ActionLi
17、stener 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);a
18、dd(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() pu
19、blic void actionPerformed(ActionEvent e) resource = checkBox.isSelected();updateButtonColor(););private void updateButtonColor() Color c = JColorChooser.showDialog(getContentPane(), / parent componentChoose a Color, / titlegetBackground(); / initial colorif(resource) button.setText(UI Resource);butt
20、on.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.swin
21、g.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.a
22、wt.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 slide
23、r = 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(ne
24、w 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(pane
25、l, 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(JInter
26、nalFrame.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()
27、 ActionListener checkBoxListener = new CheckBoxListener();ActionListener radioButtonListener = new RadioButtonListener();palette.addActionListener(checkBoxListener);filled.addActionListener(checkBoxListener);rollover.addActionListener(checkBoxListener);freeStanding.addActionListener(checkBoxListener
28、);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(palett
29、e);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) tre
30、e.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 =
31、 (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(JT
32、oolBar.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 j
33、avax.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);pr
34、ivate 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(UnsupportedLook
35、AndFeelException 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.*;
36、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.*;impor
37、t 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 i
38、sSupportedLookAndFeel() 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.*;im
39、port 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;pu
40、blic void installUI(JComponent c) c.addMouseListener(ml);public void uninstallUI(JComponent c) c.removeMouseListener(ml);public void update(Graphics g, JComponent c) / dont 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);