2008-08-12

更多交互式GUI的组件

  从前面的例子可以看出,为了响应一个事件,我们必须要建立事件监听器与触发事件的某个组件之间的联系。比如一个名为: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定义。

没有评论: