Swing的标签和按钮分别用JLabel和JButton类表示,它们是能够显示文本或图标的简单组件。缺省时,标签没有边框,可以显示一个字符串,一个图标或同时显示字符串和图标。除了用于修饰文本域等不重要的小事情外,Swing的标签还能起到图像画布(显示一个图像的组件)的作用。由于AWT的图像不是组件,不能把它们添加到一个容器中。因此,使用AWT的开发人员实现了各种不同的图像画布类;然而,在Swing中,可以把JLabel类当作图像画面使用(注:有关图像画面的更多信息参见4.3.1“Swing组件中的定制绘制”一节)。
按钮大概是使用最为普遍的用户界面组件。按钮通常带有某种边框,且可以被鼠标或快捷键激活。Swing按钮比Swing标签要复杂得多,不仅因为能够激活它们来完成某个功能,而且很多其他Swing组件都是AbstractButton类的扩展,而AbstractButton类是Swing按钮的基类。
8.1 JLabel与JBution
8.2 JLabel
例8-1 运行中的JLabel
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { public Test() { Container contentPane = getContentPane(); JLabel imageOnly = new JLabel(new ImageIcon(this.getClass().getResource("dogs.gif"))); JLabel textAndImage = new JLabel("Vote!", new ImageIcon(this.getClass().getResource("ballot_box.gif")), JLabel.RIGHT); JScrollPane scrollPane = new JScrollPane(imageOnly); scrollPane.setPreferredSize(new Dimension(270,200)); contentPane.setLayout( new FlowLayout(FlowLayout.CENTER, 25, 25)); contentPane.add(textAndImage); contentPane.add(scrollPane); } }
8.2.1 内容排列
例8-2 设置Swing标签的排列属性
import java.net.URL; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Test extends JApplet implements SwingConstants { JLabel label = new JLabel("Action!"); JPanel controlPanel = new JPanel(); JComboBox alignmentHorizontal = new JComboBox(); JComboBox alignmentVertical = new JComboBox(); public void init() { Container contentPane = getContentPane(); ImageIcon icon = new ImageIcon(this.getClass().getResource("slate.gif")); label.setIcon(icon); label.setHorizontalAlignment(CENTER); label.setFont(new Font("Times-Roman", Font.ITALIC, 20)); label.setMaximumSize(new Dimension(0, 150)); setupComboBoxes(); setupControlPanel(); contentPane.setLayout(new BorderLayout()); contentPane.add(controlPanel, "North"); contentPane.add(label, "Center"); alignmentVertical.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int c = getSwingConstantByName(s); label.setVerticalAlignment(c); } }); alignmentHorizontal.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int c = getSwingConstantByName(s); label.setHorizontalAlignment(c); } }); } void setupComboBoxes() { alignmentVertical.addItem("Top"); alignmentVertical.addItem("Center"); alignmentVertical.addItem("Bottom"); alignmentHorizontal.addItem("Left"); alignmentHorizontal.addItem("Center"); alignmentHorizontal.addItem("Right"); alignmentVertical.setSelectedItem( getSwingConstantName( label.getVerticalAlignment())); alignmentHorizontal.setSelectedItem( getSwingConstantName( label.getHorizontalAlignment())); } void setupControlPanel() { controlPanel.setBorder( BorderFactory.createTitledBorder("Alignment")); controlPanel.add(new JLabel( "Vertical:")); controlPanel.add(alignmentVertical); controlPanel.add(Box.createHorizontalStrut(5)); controlPanel.add(Box.createHorizontalStrut(25)); controlPanel.add(new JLabel( "Horizontal:")); controlPanel.add(Box.createHorizontalStrut(5)); controlPanel.add(alignmentHorizontal); } int getSwingConstantByName(String s) { if(s.equalsIgnoreCase("left")) return LEFT; else if(s.equalsIgnoreCase("center")) return CENTER; else if(s.equalsIgnoreCase("right")) return RIGHT; else if(s.equalsIgnoreCase("top")) return TOP; else if(s.equalsIgnoreCase("bottom")) return BOTTOM; return -1; } String getSwingConstantName(int c) { if(c == LEFT) return "Left"; else if(c == CENTER) return "Center"; else if(c == RIGHT) return "Right"; else if(c == TOP) return "Top"; else if(c == BOTTOM) return "Bottom"; return "undefined"; } }
8.2.2 文本的位置
例8-3 设置标签的文本位置
import java.net.URL; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Test extends JApplet implements SwingConstants { JLabel label = new JLabel("Action!"); JPanel controlPanel = new JPanel(); JComboBox alignmentHorizontal = new JComboBox(); JComboBox alignmentVertical = new JComboBox(); public void init() { Container contentPane = getContentPane(); ImageIcon icon = new ImageIcon(this.getClass().getResource("penguin.gif")); label.setIcon(icon); label.setHorizontalTextPosition(CENTER); label.setFont(new Font("Times-Roman", Font.ITALIC, 20)); setupComboBoxes(); setupControlPanel(); label.setHorizontalAlignment(JLabel.CENTER); label.setVerticalAlignment(JLabel.CENTER); contentPane.setLayout(new BorderLayout()); contentPane.add(controlPanel, "North"); contentPane.add(label, "Center"); alignmentVertical.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int c = getSwingConstantByName(s); label.setVerticalTextPosition(c); } }); alignmentHorizontal.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int c = getSwingConstantByName(s); label.setHorizontalTextPosition(c); } }); } void setupComboBoxes() { alignmentVertical.addItem("Top"); alignmentVertical.addItem("Center"); alignmentVertical.addItem("Bottom"); alignmentHorizontal.addItem("Left"); alignmentHorizontal.addItem("Center"); alignmentHorizontal.addItem("Right"); alignmentVertical.setSelectedItem( getSwingConstantName( label.getVerticalTextPosition())); alignmentHorizontal.setSelectedItem( getSwingConstantName( label.getHorizontalTextPosition())); } void setupControlPanel() { controlPanel.setBorder( BorderFactory.createTitledBorder("Text Position")); controlPanel.add(new JLabel( "Vertical:")); controlPanel.add(alignmentVertical); controlPanel.add(Box.createHorizontalStrut(5)); controlPanel.add(Box.createHorizontalStrut(25)); controlPanel.add(new JLabel("Horizontal:")); controlPanel.add(Box.createHorizontalStrut(5)); controlPanel.add(alignmentHorizontal); } int getSwingConstantByName(String s) { if(s.equalsIgnoreCase("left")) return LEFT; else if(s.equalsIgnoreCase("center")) return CENTER; else if(s.equalsIgnoreCase("right")) return RIGHT; else if(s.equalsIgnoreCase("top")) return TOP; else if(s.equalsIgnoreCase("bottom")) return BOTTOM; return -1; } String getSwingConstantName(int c) { if(c == LEFT) return "Left"; else if(c == CENTER) return "Center"; else if(c == RIGHT) return "Right"; else if(c == TOP) return "Top"; else if(c == BOTTOM) return "Bottom"; return "undefined"; } }
8.2.3 图标/文本间隙
例8-4 设置一个标签的图标/文本间隙
import java.net.URL; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Test extends JApplet implements SwingConstants { public void init() { Container contentPane = getContentPane(); JComboBox iconTextGap = new JComboBox(); JPanel controlPanel = new JPanel(); ImageIcon icon = new ImageIcon(this.getClass().getResource("ladybug.gif")); final JLabel label = new JLabel("Lady Bug", icon, CENTER); label.setFont(new Font("Times-Roman", Font.ITALIC, 20)); iconTextGap.addItem("4"); iconTextGap.addItem("10"); iconTextGap.addItem("15"); iconTextGap.addItem("20"); iconTextGap.addItem("25"); controlPanel.add(new JLabel("Icon/Text Gap:")); controlPanel.add(iconTextGap); contentPane.setLayout(new BorderLayout()); contentPane.add(controlPanel, "North"); contentPane.add(label, "Center"); iconTextGap.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int gap = Integer.parseInt(s); label.setIconTextGap(gap); } }); } }
8.2.4 许可状态
例8-5 设置一个标签的许可状态
import java.net.URL; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Test extends JApplet implements SwingConstants { public void init() { Container contentPane = getContentPane(); JComboBox iconTextGap = new JComboBox(); JPanel controlPanel = new JPanel(); ImageIcon icon = new ImageIcon(this.getClass().getResource("ladybug.gif")); final JLabel label = new JLabel("Lady Bug", icon, CENTER); label.setFont(new Font("Times-Roman", Font.ITALIC, 20)); iconTextGap.addItem("4"); iconTextGap.addItem("10"); iconTextGap.addItem("15"); iconTextGap.addItem("20"); iconTextGap.addItem("25"); controlPanel.add(new JLabel("Icon/Text Gap:")); controlPanel.add(iconTextGap); contentPane.setLayout(new BorderLayout()); contentPane.add(controlPanel, "North"); contentPane.add(label, "Center"); iconTextGap.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int gap = Integer.parseInt(s); label.setIconTextGap(gap); } }); } }
8.2.5 JLabel属性
8.2.6 JLabel事件
8.2.7 JLabel类总结
例8-6 创建JLabel实例
import java.net.URL; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Test extends JApplet implements SwingConstants { public void init() { Container contentPane = getContentPane(); JComboBox iconTextGap = new JComboBox(); JPanel controlPanel = new JPanel(); ImageIcon icon = new ImageIcon(this.getClass().getResource("ladybug.gif")); final JLabel label = new JLabel("Lady Bug", icon, CENTER); label.setFont(new Font("Times-Roman", Font.ITALIC, 20)); iconTextGap.addItem("4"); iconTextGap.addItem("10"); iconTextGap.addItem("15"); iconTextGap.addItem("20"); iconTextGap.addItem("25"); controlPanel.add(new JLabel("Icon/Text Gap:")); controlPanel.add(iconTextGap); contentPane.setLayout(new BorderLayout()); contentPane.add(controlPanel, "North"); contentPane.add(label, "Center"); iconTextGap.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent event) { JComboBox b = (JComboBox)event.getSource(); String s = (String)b.getSelectedItem(); int gap = Integer.parseInt(s); label.setIconTextGap(gap); } }); } }
8.3 按钮
8.4 JButtion
例8-7 一个按钮简单例子
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class Test extends JApplet { JButton button = new JButton("button ...", new ImageIcon(this.getClass().getResource("exclaim.gif"))); int actCnt = 0; public void init() { Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { showStatus(event.getActionCommand() + " activated " + actCnt + " times"); actCnt++; } }); } }
8.4.1 JButtion属性
8.4.2 JButtion事件
例8-8 处理JButton事件
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class Test extends JApplet { //Icon icon = new ImageIcon("icon.gif"); JButton button = new JButton("button"); public Test() { Container contentPane = getContentPane(); button.setRolloverIcon(new ImageIcon(this.getClass().getResource("punch.gif"))); button.setIcon(new ImageIcon(this.getClass().getResource("open_hand.gif"))); contentPane.setLayout(new FlowLayout()); contentPane.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("action!"); } }); button.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { System.out.println(getButtonState()); } }); } private String getButtonState() { ButtonModel model = button.getModel(); String state = "Button State: "; state += model.isSelected() ? "selected" : "deselected"; state += model.isPressed() ? ", pressed" : ", not pressed"; state += model.isArmed() ? ", armed" : ", disarmed"; state += model.isRollover() ? ", rollover" : ", not rollover"; return state; } }
8.4.3 JButtion类总结
例8-9 创建JButton实例
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { Icon icon = new ImageIcon("icon.gif"); JButton noargButton = new JButton(), textButton = new JButton("text"), textIconButton = new JButton("text", icon), iconButton = new JButton(icon); public Test() { Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(noargButton); contentPane.add(textButton); contentPane.add(iconButton); contentPane.add(textIconButton); } }
例8-10 把一个按钮指定为缺省的按钮
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { Icon icon = new ImageIcon("icon.gif"); JButton noargButton = new JButton(), textButton = new JButton("text"), textIconButton = new JButton("text", icon), iconButton = new JButton(icon); public Test() { Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(noargButton); contentPane.add(textButton); contentPane.add(iconButton); contentPane.add(textIconButton); } }
例8-11 程序方式单击一个按钮
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { int clickDuration = 68; public Test() { Container contentPane = getContentPane(); JPanel controlPanel = new JPanel(); JPanel buttonPanel = new JPanel(); JButton doClick = new JButton("do click"); final JButton clickMe = new JButton("click me"); final JComboBox comboBox = new JComboBox(new Object[] { "68", "250", "500", "750", "1000" }); controlPanel.add(new JLabel("Click Duration:")); controlPanel.add(comboBox); buttonPanel.add(doClick); buttonPanel.add(clickMe); contentPane.add(controlPanel, BorderLayout.NORTH); contentPane.add(buttonPanel, BorderLayout.CENTER); getRootPane().setDefaultButton(doClick); doClick.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { clickMe.doClick(clickDuration); } }); comboBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) { clickDuration = Integer.parseInt((String) comboBox.getSelectedItem()); } } }); } }
例8-12 JButton图标
import javax.swing.*; import javax.swing.border.*; import javax.swing.plaf.basic.*; import java.awt.*; import java.awt.event.*; public class Test extends JApplet { public void init() { Container contentPane = getContentPane(); Icon icon = new StringIcon("icon for JButton"), rolloverIcon = new StringIcon("rollover"), pressedIcon = new StringIcon("pressed"), disabledIcon = new StringIcon("disabled"), selectedIcon = new StringIcon("selected"), rolloverSelectedIcon = new StringIcon("rollover selected"), disabledSelectedIcon = new StringIcon("disabled selected"); final JButton button = new JButton(); button.setRolloverEnabled(true); button.setIcon(icon); button.setRolloverIcon(rolloverIcon); button.setRolloverSelectedIcon(rolloverSelectedIcon); button.setSelectedIcon(selectedIcon); button.setPressedIcon(pressedIcon); button.setDisabledIcon(disabledIcon); button.setDisabledSelectedIcon(disabledSelectedIcon); JComboBox cb = new JComboBox(); cb.addItem("enabled"); cb.addItem("disabled"); cb.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) { String item = (String)e.getItem(); if(item.equals("enabled")) { button.setEnabled(true); } else { button.setEnabled(false); } } } }); contentPane.setLayout(new FlowLayout()); contentPane.add(cb); contentPane.add(button); } } class StringIcon implements Icon { private String s; public StringIcon(String s) { this.s = s; } public int getIconWidth() { return 100; } public int getIconHeight() { return 100; } public void paintIcon(Component c, Graphics g, int x, int y) { FontMetrics fm = g.getFontMetrics(); g.setColor(c.getForeground()); g.drawString(s, 10, fm.getHeight()); } }
例8-13 设置按钮边距
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { public Test() { Container contentPane = getContentPane(); JButton button = new JButton("button"); button.setMargin(new Insets(50,25,10,5)); contentPane.setLayout(new FlowLayout()); contentPane.add(button); } }
例8-14 按钮助记符
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JApplet { public Test() { Container contentPane = getContentPane(); JButton button = new JButton("button With Mnemonic"); button.setMnemonic('M'); contentPane.setLayout(new FlowLayout()); contentPane.add(button); } }