一、滑块和JSpinner组件
滑块:
滑块允许连续值的选择,通常其构造方法为
JSlider jslid = new JSlider(int min,int max,int initialValue);
JSlider jslid = new JSlider(SwingConstants.VERTICAL,int min,int max,int initialValue);
当用户滑动滑块时,就会触发一个ChangeEvent事件,会向ChangeListener监听器发出通知,其只有一个stateChanged方法。调用addChangeListener方法添加监听器。
在stateChanged方法中可以获取滑块的当前值
public void stateChanged(ChangeEvent e)
{
JSlider js = (JSlider) e.getSource();
int value = js.getValue();
//......
}
滑块可以设置大标尺和小标尺
jslid.setMajorTickSpacing(20); //每隔20距离设置一个大标尺
jslid.setMinorTickSpacing(5); //每隔5距离设置一个小标尺
上面只是设置了大小标尺,如果要显示出来还需调用
jslid.setPaintTicks(true);
也可以给大标尺添加尺寸标签,调用如下方法
jslid.setPaintLabels(true);
此处的标签是默认的值,对于一个范围0~100大标尺20的滑块,其标签默认是0,20,40,60,80和100。
也可以提供其它标尺标记,如字符串和图标,但通常使用JLabel对象。构造一个hashtable,Key为Integer类型,Value为Component类型,然后调用setLabelTable方法即可。
HashTbale<Integer,Component> labelTable = new HashTable<Integer,Component>();
labelTable.put(0,new JLabel("A"));
labelTable.put(20,new JLabel("B"));
//.....................
labelTable.put(100,new JLabel("F"));
jslid.setLabelTbale(labelTable);
滑块移动轨迹可以通过调用setPaintTrack方法设置是否显示。setInverted方法设置滑块是是否逆向滑动即从右向左或者从下向上滑动。
JSpinner组件:
JSpinner是带有两个小按钮的文本域,可以通过点击按钮增加或减少文本域的值。其中的值可以是数字、日期、来自列表的值以及任何可以用上一个和下一个决定值的序列。
其构造方法public JSpinner(SpinnerModel model)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
public class SliderSpinnerTest01
{
public static void main(String[] args)
{
SliderSpinnerFrame checkBox = new SliderSpinnerFrame();
checkBox.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
checkBox.setVisible(true);
}
}
class SliderSpinnerFrame extends JFrame
{
public SliderSpinnerFrame()
{
setTitle("SliderSpinner");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
value=INI_FONT_SIZE;
//内容标签
textLabel=new JLabel("The quick brown fox jumps over the lazy dog");
textLabel.setFont(new Font("serif",Font.PLAIN,MIN_FONT_SIZE));
JPanel centerPanel=new JPanel();
centerPanel.add(textLabel);
add(centerPanel,BorderLayout.CENTER);
//字大小部分
fontSizeLabel=new JLabel("字体大小");
fontValueLabel=new JLabel("字体大小值:"+INI_FONT_SIZE);
fontSizeSlid = new JSlider(SwingConstants.HORIZONTAL,MIN_FONT_SIZE,MAX_FONT_SIZE,INI_FONT_SIZE);
fontSizeSlid.setMajorTickSpacing(10);
fontSizeSlid.setMinorTickSpacing(2);
fontSizeSlid.setPaintTicks(true);
JPanel sizePanel = new JPanel();
sizePanel.add(fontSizeLabel);
sizePanel.add(fontSizeSlid);
sizePanel.add(fontValueLabel);
//字体样式部分
String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
fontStyleLabel=new JLabel("字体样式");
fontSpin = new JSpinner(new SpinnerListModel(fonts));
JPanel stylePanel = new JPanel();
stylePanel.add(fontStyleLabel);
stylePanel.add(fontSpin);
JPanel southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
southPanel.add(sizePanel,BorderLayout.CENTER);
southPanel.add(stylePanel,BorderLayout.SOUTH);
add(southPanel,BorderLayout.SOUTH);
ChangeListener jslidListener = new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
JSlider jsl = (JSlider) e.getSource();
value = (Integer)jsl.getValue();
fontValueLabel.setText("字体大小值:"+value);
textLabel.setFont(new Font((String)fontSpin.getValue(),Font.PLAIN,value));
}
};
fontSizeSlid.addChangeListener(jslidListener);
ChangeListener jspnListener = new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
textLabel.setFont(new Font((String)fontSpin.getValue(),Font.PLAIN,value));
}
};
fontSpin.addChangeListener(jspnListener);
}
private JLabel textLabel;
private JLabel fontSizeLabel;
private JLabel fontValueLabel;
private JSlider fontSizeSlid;
private JSpinner fontSpin;
private JLabel fontStyleLabel;
private int value;
private static final int DEFAULT_WIDTH=400;
private static final int DEFAULT_HEIGHT=200;
private static final int MIN_FONT_SIZE=12;
private static final int MAX_FONT_SIZE=32;
private static final int INI_FONT_SIZE=12;
}
运行结果:
二、菜单
菜单创建:
创建一个菜单栏
JMenuBar menuBar = new JMenuBar();
菜单栏是一个可以添加到任何地方的组件。正常情况显示在框架顶部。使用setJMenuBar方法在框架上添加菜单栏
jframe.setJMenuBar(menuBar);
为每个菜单建立一个菜单对象
JMenu editMenu = new JMenu("Edit");
将顶层菜单添加到菜单栏
menuBar.add(editMenu);
往菜单对象中添加菜单项
JMenuItem pasteItem = new JMenuItem("Paste");
editMenu.add(pasteItem);
往菜单中添加分隔符
editMenu.addSeparator();
往菜单中添加子菜单
JMenu menuOpti = new JMenu("Option");
editMenu.add(menuOpti);
可以通过JMenu.add(String s)方法将菜单项插入到菜单的末尾,其返回类型为Component
JMenuItem copyItem = editMenu.add("Copy");
复选框和单选按钮菜单项:
创建复选框菜单项
JCheckBoxMenuItem checkItem = new JCheckBoxMenuItem("Check"); menuOpti.add(checkItem);
单选按钮菜单项与单选按钮一样,也需要放入按钮组ButtonGroup中。
JRadioButtonMenuItem checkItem1 = new JRadioButtonMenuItem("check1"); JRadioButtonMenuItem checkItem2 = new JRadioButtonMenuItem("check2"); ButtonGroup butGroup = new ButtonGroup(); butGroup.add(checkItem1); butGroup.add(checkItem2); menuOpti.add(checkItem1); menuOpti.add(checkItem2);
使用单选复选框菜单,一般不需要立刻得到用户菜单选择的通知,而是使用isSelected方法来测试菜单项的当前状态。
弹出菜单:
建立弹出菜单与一般菜单很类似,只是弹出菜单没有标题。
JPopupMenu popupMenu = new JPopupMenu();
添加菜单项的方法与一般菜单添加菜单项方法相同。
弹出菜单必须调用show方法才能显示弹出菜单。调用时需要给出父组件以及相对父组件坐标的显示位置。
popupMenu.show(panel,x,y);
通常,当用户点击某个鼠标键时弹出菜单,使用弹出式触发器,调用方法如下:
component.setComponentPopupMenu(popupMenu);
有时会遇到有弹出菜单的组件中含有另外一个组件,这个组件可以通过调用下列方法继承父组件的弹出菜单
child.setInheritsPopupMenu(true);
快捷键和加速器:
可在菜单项构造器中指定一个快捷字母来为菜单项设置快捷键。
JMenuItem cutItem = new JMenuItem("Cut","T");
快捷键会自动的显示在菜单项中,并有一条下划线,当然如果快捷键不是菜单项名称中的一个字母的话,就不会显示该快捷键。
只能在菜单项的构造器中设置快捷键而不能在菜单的构造器中设置快捷键,对于菜单快捷键需要调用setMnemonic方法。
JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic("H");
加速器是在不打开菜单的情况下选择菜单项的快捷键,使用setAccelerator方法可以将加速器关联到一个菜单项。使用KeyStroke类型对象作为参数。
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK));
加速器只能加到菜单项上不能加到菜单上,当加速器加到对应的菜单项上时,对应的组合键就会自动的显示在该菜单项上。
启用和禁用菜单项:
有时一些菜单项可能在特定的情况下才可用,此时就涉及到菜单项的启用和禁用。所谓禁用就是菜单项变灰,不可选择。
启用和禁用菜单项需要调用setEnabled方法。
启用和禁用菜单项有两种策略
1、每次环境发生变化就对相关的菜单项或者动作调用setEnabled方法。
2、使用MenuListener监听器。
MenuListener接口有三个方法:
void menuSelected(MenuEvent e);
void menuDeselected(MenuEvent e);
void menuCanceled(MenuEvent e);
menuSelected方法在显示之前调用,可以用来禁用或者启用菜单项。
public void menuSelected(MenuEvent e) { saveAction.setEnabled(!readOnlyItem.isSelected()); saveAsAction.setEnabled(!readOnlyItem.isSelected()); }
一个菜单项如果有加速键,使用上面的在显示菜单之前禁用菜单项会失效。