Java学习笔记之Swing(三)

和自甴很熟 提交于 2019-12-06 00:22:07

Java学习笔记之Swing(三)

Swing中的常用控件

你将学到:

  • 了解如何创建文本框和文本框的实际应用;
  • 了解如何创建复选框和复选框的实际应用;
  • 了解如何创建单选按钮和单选按钮的实际应用;

文本框

文本框和按钮一样,都是非常常用的控件,文本框提供了一个输 入信息的控件。

文本框是通过JTextField类来创建的,在创建的文本框中当文本超出文本框规定长度时,将自动滚动文本显示。文本框是通过JTextField类的构造器创建的,包括5种构造器,如表所示。

构造器 说明
public JTextFiled() 创建普通的文本框
public JTextFiled(String text) 创建右默认值的文本框
public JTextFiled(int columns) 创建指定长度的文本框
public JTextFiled(String text,int columns) 创建指定长度和指定文本内容的文本框
public JTextFiled(Documents doc,String text,int columens) 创建具有默认值,长度和文本内容的文本框

文本框也是会触发事件的,它和按钮一样,都是触发ActionEvent事件。按钮是被单击时触发事件,而文本框是当用户按下回车键时触发事件。

多行文本框

当希望进行多行输入时,文本框就不能满足其要求,这时候就需要创建多行文本框。多行文本框也是文本框的一种特殊形式,多行文本框是通过JTextArea类实现的。JTextArea类中提供了6种构 造器来创建多行文本框,构造器如表所示。

构造器|说明
------|----
public TextArea()|创建没有内容的多行文本框,默认的行数和列数为0
public TextArea(String text)|创建指定内容的文本框,默认的行数和列数为0
public TextArea(int row,int columns)|创建一个指定行和列的多行文本框
public TextArea(String text,int row,int columns)|创建指定行,列和文本内容的多行文本框
public TextArea(Documents doc)|创建具有文档模型的多行文本框。默认的行和列为0
public TextArea(Documents doc,String text,int row,int columns)|创建指定文本模型、文本内容、列和行的多行文本框

密码框

密码框是文本框的改进的控件,是一种专门用于输入密码的文本 框。在文本框中输入信息后,将不直接显示输入的信息,而是使 用特定的特殊字符来进行显示。密码框是通过JPasswordField类 来创建的,因为密码框和文本框的关系,所以JPasswordField类的构造器是和JTextField类的构造器相同的

复选框和单选按钮

复选框和单选按钮具有很多相似的地方,它们在实际开发中也经 常要使用到。例如需要用户来选择兴趣爱好时,一般都很少是只 有一个爱好的,这里就可以创建复选框来实现其功能,来让用户 进行多项选择操作。但是例如性别等信息,是不可能存在多个选 择的,它只能在有限的几个选项中选择其中一个,这里就可以使 用单选按钮。

复选框

通过JRadioButton与ButtonGroup的配合使用,可以很方便地实现 单项选择。若需要使用多项选择,则应该使用复选框——JCheckBox类。与JRadioButton的不同是,JCheckBox不需要编组 使用,各个选项之间没有逻辑约束关系。 该类提供了8个构造器,表中列出了其中7个比较常用的。

构造器 说明
public JCheckBox() 创建没有任何内容的复选框
public JCheckBox(Icon icon) 创建指定图标的复选框
public JCkeckBox(Icon icon,boolean selected) 创建指定图标以及是否被选中的复选框(若布尔值为true则表示被选中)
public JCkeckBox(String text) 指定复选框的内容
public JCheckBox(String text,boolean selected) 创建指定文本以及是否被选中的复选框
public JCheckBox(String text,Icon icon) 创建指定文本和图标的复选框
public JCkeckBox(String text,Icon icon,boolean selected) 创建指定文字、图标以及确定是否被选中的复选框
实例代码:
public class JCheckBoxTest {
    private static void constructGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("JCheckBox Test");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         //JCheckBox ac = new JCheckBox("A/C",true);使用复选框的两个参数的构造器来简化代码
         JCheckBox ac = new JCheckBox("A/C");
         ac.setSelected(true);
        JCheckBox cdPlayer = new JCheckBox("CD Player");
        JCheckBox cruiseControl = new JCheckBox("Cruise Control");
        JCheckBox keylessEntry = new JCheckBox("Keyless Entry");
        JCheckBox antiTheft = new JCheckBox("Anti-Theft Alarm");
        JCheckBox centralLock = new JCheckBox("Central Lock");
        frame.add(new JLabel("Car Features"));
        frame.add(ac);
        frame.add(cdPlayer);
        frame.add(cruiseControl);
        frame.add(keylessEntry);
        frame.add(antiTheft);
        frame.add(centralLock);
        frame.pack();//pack()方法可以将JFrame内容面板中的控件调整到适合的尺寸和布局
        frame.setVisible(true);
    }
    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                constructGUI();
            }
        });
    }

}

如果我们不想调用pack方法的话,我们可以调用JFrame的setSize和SetBounds方法。需要注意的是我们需要在setVisible方法前调用这两个方法。

效果图:

输入图片说明

单选按钮

单选按钮是一种只能在一组选项中选择其中一个选项的控件。单选按钮是通过使用JRadioButton类来创建的,在JRadioButton类 中具有7种构造器形式,构造器如表所示。

  构造器|说明
  -----|----
  public JRadioButton()|创建没有文字、图标以及没有被选中的按钮
  public JRadioButton(Icon icon)|创建一个具有图标的按钮
  public JRadioButton(Icon icon,boolean selected)|创建指定图标,以及确定是否被选中的按钮
  public JRadioButton(String text)|创建一个指定按钮文字的按钮
  public JRadioButton(String text,boolean selected)|创建指定文字以及确定选中与否的按钮
  public JRadioButton(String text,Icon icon)|创建有文字和图标的按钮
  public JRadioButton(String text,Icon icon,boolean selected)|创建指定文本、按钮以及是否被选中的按钮

实例代码:

  	   	//创建三个单选按钮
  	   	JRadioButton button1 = new JRadioButton("Red");
        JRadioButton button2 = new JRadioButton("Green");
        JRadioButton button3 = new JRadioButton("Blue");
        // 创建按钮组
        ButtonGroup colorButtonGroup = new ButtonGroup();
        colorButtonGroup.add(button1);
        colorButtonGroup.add(button2);
        colorButtonGroup.add(button3);
        button1.setSelected(true); //设置默认情况下按钮1被选中
        frame.add(new JLabel("Color:"));
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.pack();
        frame.setVisible(true);

注意:当我们创建多个单选按钮时,如果我们不将按钮添加到按钮组中,那么多个按钮就会出现同时被选中的情况。

选项卡

选项卡也是开发GUI界面常用的控件之一,通过使用选项卡可以在 同一个窗体中提供很多不同的界面,可以通过选项卡提供的标签 在界面间方便地进行切换。选项卡是通过JTabbedPane类创建的。

选项卡可以产生多个标签框架,每一个标签框架窗口自成一个系统,即 包含多个页面,每个页面与一个标签对应。当选择某一个标签时,标签 框架窗口会自动显示出此标签框架的内容,并触发一个ChangeEvent事件 ,这个事件由ChangeListener监听器监听并处理。

选项卡具有以下构造方法及常用方法:

  • public JTabbedPane()方法:该方法创建一个TabbedPane对象,该对象 具有默认的JTabbedPane.TOP选项卡布局;
  • public JTabbedPane(int tabPlacement)方法:该方法使用指定的参数tabPlacement创建一个TabbedPane对象,tabPlacement参数有常值, JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT或 JTabbedPane.RIGHT
  • public JTabbedPane(int tabPlacement, int tabLayoutPolicy)方法: 该方法以指定的参数tabPlacement、tabLayoutPolicy创建一个TabbedPane对象,该对象具有指定的tabPlacement选项卡布局和tabLayoutPolicy选项卡布局策略。其中参数tabLayoutPolicy有常值, JTabbedPane.WRAP_TAB_LAYOUT、JTabbedPane.SCROLL_TAB_LAYOUT

分割窗口

分割窗格(JSplitPane)也是Swing中常用的控件之一,其能够将单个空间分割成两个部分,并在两个部分中显示不同的内容。

JSplitPane控件允许在单个空间中放置两个控件,开发人员可以 自由决定按水平方向或垂直方向划分空间,还可以在程序运行期 间使用鼠标自由调整空间的分割比例。通过JSplitPane控件的嵌 套使用,可以将空间分割成更多的部分。JSplitPane类提供了5个构造器,如表所示。

滑块和进度条

滑块

JSlider类是Swing包中提供的用于实现滑块的控件,通过JSlider控件可以让用户在限定的范围内方便地选择需要的值。JSlider类 提供的滑块可以是水平方向的,也可以是垂直方向的,并且可以 根据需要设置成为不同的外观风格。

提示:滑块组件是由可以拖动的滑块和一个范围组件组成的;用 户可以通过拖动滑块在一个区间范围里进行选择。

进度条

ProgressBar是Swing中提供的用来实现进度条的控件,使用其可以非常方便地完 成进度条的开发。在应用中恰当使用进度条可以即时通告用户系统的一些信息,避免用户因不知道系统运行情况而焦急地等待,从而使界面更加友好。 JProgressBar类提供了5个构造器,其中有4个是比较常用的,下表列出了这4个常用的构造器。

列表框

列表是图形用户界面程序中常 用到的组件,列表允许用户从列表项中选择一个或多个选项,默认情况下,列表支持单选;选择状态由分隔符来区别。并且可以通过JList中提供的setSelectionMode方法使得列表支持多选。

JList的常用构造方法如下所示:

  • public JList()方法:该方法可以构造一个使用空模型的JList对 象。
  • public JList(Object[] listData)方法:该方法以显示指定数组 中的元素构造一个JList。

注意:JList类没有提供滚动功能,但是可以通过将其放置在 JScrollPane中来实现滚动操作。

下拉列表框

下拉列表及组合框,下拉列表与列表不同的是,下拉列表只支持 单个选项,只允许用户选择一个选项。优点是能节省空间,使界 面更紧凑。并且只有用户单击下拉列表时,列表选项才会显示。下拉列表框是通过JComboBox类来创建的,JComboBox控件实际上组合了一个文本框与一个下拉列表。

注意:在默认的情况下,下拉列表是不可以被用户编辑的,但是可以使用JComboBox提供的方法setEditable方法使其可以被编辑 。

菜单

菜单(JMenu)是标题栏下面的一行文字部分。菜单是应用程序中最常用的组件。菜单的组织方式为:一个菜单条JMenuBar包含多个菜单项(JMenuItem)。JMenuItem有两个子类,分别为JRadioButtonMenuItemJCheckBoxMenuItem用于表示单选菜单项和复选菜单项。当用户选择某个菜单项后,就会触发一个ActionEvent事件,由ActionListener监听器处理。

菜单项有两种状态:启用状态和禁用状态,菜单项的状态可以使 用setEnabled()方法设置。创建完整的菜单一般需要以下几步:

  1. 创建菜单栏;
  2. 创建菜单以及子菜单;
  3. 创建菜单项;
  4. 将菜单项添加到子菜单或菜单中,将子菜单加入到菜单中,将菜单加入到菜单栏。

实例代码:

JMenuBar menuBar = new JMenuBar();//创建菜单栏
    JMenu fileMenu = new JMenu("File");
    JMenu editMenu = new JMenu("Edit");
    JMenu helpMenu = new JMenu("Help");
    //将菜单添加到菜单栏
    menuBar.add(fileMenu);
    menuBar.add(editMenu);
    menuBar.add(helpMenu);
    // 为每一个菜单创建子菜单
    JMenuItem fileNewMI = new JMenuItem("New");
    JMenuItem fileOpenMI = new JMenuItem("Open");
    JMenuItem fileSaveMI = new JMenuItem("Save");
    JMenuItem fileExitMI = new JMenuItem("Exit");
    // 将子菜单添加到菜单
    fileMenu.add(fileNewMI);
    //为菜单添加事件监听器
    fileNewMI.addActionListener(actionListener);
    fileMenu.add(fileOpenMI);
    fileOpenMI.addActionListener(actionListener);
    fileMenu.add(fileSaveMI);
    fileSaveMI.addActionListener(actionListener);
    fileMenu.addSeparator();
    fileMenu.add(fileExitMI);
    fileExitMI.addActionListener(actionListener);
    JMenuItem editCopyMI = new JMenuItem("Copy");
    JMenuItem editPasteMI = new JMenuItem("Paste");
    editMenu.add(editCopyMI);
    editMenu.add(editPasteMI);
    JMenuItem helpAboutMI = new JMenuItem("About");
    helpMenu.add(helpAboutMI);

运行效果:

输入图片说明

弹出式菜单

弹出式菜单有时也称为右键菜单,其一般在用户按下鼠标右键时在鼠标位置弹出,能够给用户的操作提供更大的方便。从某种程度上来说,右键菜单设计的好坏直接影响应用程序的易用性。弹出式菜单是通过JPopupMenu类来创建,通过该类提供的show方法将菜单显示在指定的位置上。

注意:JPopupMenu类不是继承JMenu类的而是从JComponent类继承过来。弹出式菜单的创建和菜单的创建基本相同,也需要新建一个弹出式菜单后再加入菜单项。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!