一、滑塊和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());
}
一個菜單項如果有加速鍵,使用上面的在顯示菜單之前禁用菜單項會失效。