从前面的例子可以看出,为了响应一个事件,我们必须要建立事件监听器与触发事件的某个组件之间的联系。比如一个名为:ButtonListener的动作监听器,要响应某个JButton对象。可以这样写:
JButton button = new JButton();
button.addActionListener(new ButtonListener());
这样以来,监听器就会响应这个按钮发出的任何动作事件。
这里addActionListener类通过多态性接受了一个实现ActionListener接口的类对象。
接下来是在交互式程序中基本都需要的文件选择对话框(FILE CHOOSER):
下面这个小程序可以让用户选择某个文本文件,并把内容显示出来:
Main.java:
import java.util.Scanner;
import java.io.*;
import javax.swing.*;
public class Main
{
public static void main(String[] args) throws IOException
{
JFrame frame = new JFrame("File Contents");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea txtarea = new JTextArea (20,30);
JFileChooser fchooser = new JFileChooser();
int status = fchooser.showOpenDialog(null);
if (status != JFileChooser.APPROVE_OPTION)
{
txtarea.setText("Not any file have been choosen");
}
else
{
File file = fchooser.getSelectedFile();
Scanner scan = new Scanner(file);
String cont = "";
while(scan.hasNext())
{
cont += scan.nextLine() + "\n";
}
txtarea.setText(cont);
}
frame.getContentPane().add(txtarea);
frame.pack();
frame.setVisible(true);
}
}
这个程序主要在于diaoyong showOpenDialog显示一个文件选择对话框,这个方法会返回一个整型值,可以通过于JFileChooser类中定义的常量比较来了解用户操作状态。
此外还用到了JTextArea类,该类默认是可编辑的。
接下来是滑动条:
我们写一个RGB值的颜色选择器:
main.java:
package forlearning;
import java.awt.*;
import javax.swing.*;
public class Main
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Set Color");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new SlideColorPanel());
frame.pack();
frame.setVisible(true);
}
}
slideColorPanel.java:
package forlearning;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class SlideColorPanel extends JPanel
{
private JPanel controls,colorPanel;
private JSlider RSlider,BSlider,GSlider;
private JLabel RLabel,BLabel,GLabel;
public SlideColorPanel()
{
RSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
RSlider.setMajorTickSpacing(50);
RSlider.setMinorTickSpacing(10);
RSlider.setPaintTicks(true);
RSlider.setPaintLabels(true);
RSlider.setAlignmentX(Component.LEFT_ALIGNMENT);
BSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
BSlider.setMajorTickSpacing(50);
BSlider.setMinorTickSpacing(10);
BSlider.setPaintTicks(true);
BSlider.setPaintLabels(true);
BSlider.setAlignmentX(Component.LEFT_ALIGNMENT);
GSlider = new JSlider (JSlider.HORIZONTAL,0,255,0);
GSlider.setMajorTickSpacing(50);
GSlider.setMinorTickSpacing(10);
GSlider.setPaintTicks(true);
GSlider.setPaintLabels(true);
GSlider.setAlignmentX(Component.LEFT_ALIGNMENT);
SliderListener listener = new SliderListener();
RSlider.addChangeListener(listener);
BSlider.addChangeListener(listener);
GSlider.addChangeListener(listener);
RLabel = new JLabel("Red: 0 ");
RLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
BLabel = new JLabel("Blue: 0 ");
BLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
GLabel = new JLabel("Green: 0 ");
GLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
controls = new JPanel();
BoxLayout layout = new BoxLayout (controls ,BoxLayout.Y_AXIS);
controls.setLayout(layout);
controls.add(RLabel);
controls.add(RSlider);
controls.add(Box.createRigidArea(new Dimension(0,20)));
controls.setLayout(layout);
controls.add(BLabel);
controls.add(BSlider);
controls.add(Box.createRigidArea(new Dimension(0,20)));
controls.setLayout(layout);
controls.add(GLabel);
controls.add(GSlider);
colorPanel = new JPanel();
colorPanel.setPreferredSize(new Dimension(100,100));
colorPanel.setBackground(new Color(0,0,0));
add (controls);
add (colorPanel);
}
private class SliderListener implements ChangeListener
{
private int red,blue,green;
public void stateChanged(ChangeEvent event)
{
red=RSlider.getValue();
blue=BSlider.getValue();
green=GSlider.getValue();
RLabel.setText("RED:" + red);
BLabel.setText("BLUE:" + blue);
GLabel.setText("GREEN:" + green);
colorPanel.setBackground (new Color(red,green,blue));
}
}
}
程序是相当漂亮的:
这个程序看起来代码比较长,实际重复的东西很多,所以真正值得看的只有1/3左右吧。main方法只是简单添加了一个面板到框架。而SlideColorPanel继承了JPanel类,并且使用box布局管理器来排列三个滑动条和三个标签。
滑动条是由JSlider创建的,它的四个参数分别指定了方向,最大值和最小值,初始值。
而setMajorTickSpacing和setMinorTickSpacing分别就指定了条上大的刻度和小的刻度的分割值。最后setPaintTicks表示允许显示上面定义的两个东西。setPaintLabels表示显示标签也就是下面的刻度值。
而监听器通过实现ChangeListener接口来进行修改。
组合框(combo box)
这个东西就是一个下拉菜单由JComboBox类定义。
滚动窗格(scroll pane)
就是有滚动条的窗格,由JScrollPane类定义。
分隔窗格(split pane)
可以创建为一上一下或一左一右的形式,由JSplitPane定义。
2008-08-12
更多交互式GUI的组件
订阅:
博文评论 (Atom)
没有评论:
发表评论