复选框、单选按钮、边框、组合框、滑动条——组件选择

复选框

复选框需要一个紧邻它的标签来说明其用途。在构造器中指定标签文本。
bold = new JCheckBox("Bold")
可以使用setSelected方法来选定或取消选定复选框。
bold.setSelected(true)
isSelected 方法将返回每个复选框的当前状态。如果没有选取则为false,否则为true.
当用户点击复选框时将触发一个动作事件。通常,可以为复选框设置一个动作监听器。下面的例子,两个复选框使用了同一个动作监听器。
ActionListener listener = . . .
bold.addActionListener(listener);
italic.addActionListener(listener);
actionPerformed方法查询bold和italic两个复选框的状态,并且把面板中的字体设置为常规、加粗、倾斜或者粗斜体。

package checkbox;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class CheckBox {

    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                JFrame frame = new CheckBoxFrame();
                frame.setTitle("CheckBox");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class CheckBoxFrame extends JFrame{
    private static final long serialVersionUID = 1L;

    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;
    private JLabel label;
    private JCheckBox bold;
    private JCheckBox itatic;
    private static final int FONTSIZE = 24;

    public CheckBoxFrame(){
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);     //设置窗口大小

        //设置两个复选框的监听事件
        ActionListener listener = new ActionListener(){
            public void actionPerformed(ActionEvent event){
                int mode = 0;
                if (bold.isSelected())      mode += Font.BOLD;
                if (itatic.isSelected())    mode += Font.ITALIC;
                label.setFont(new Font("Serif", mode, FONTSIZE));
            }
        };

        //创建标签画板
        JPanel centerPanel = new JPanel();
        label = new JLabel("Do what you want to do...");
        label.setFont(new Font("Serif", Font.PLAIN, FONTSIZE));
        centerPanel.add(label);
        add(centerPanel, BorderLayout.CENTER);

        //创建复选框画板
        JPanel buttonPanel = new JPanel();
        bold = new JCheckBox("Bold");
        bold.addActionListener(listener);
        buttonPanel.add(bold);

        itatic = new JCheckBox("Itatic");
        itatic.addActionListener(listener);
        buttonPanel.add(itatic);

        add(buttonPanel, BorderLayout.SOUTH);
    }
}
  • JCheckBox(String label, Icon icon)
    构造一个复选框,初始没有被选择
  • JCheckBox(String label, boolean state)
    用给定的标签和初始化状态构造一个复选框
  • boolean isSelected()
  • void setSecected(boolean state)
    获取或设置复选框的选择状态

单选按钮

在Swing中,实现单选按钮组非常简单。为单选按钮组构造一个ButtonGroup的对象。然后,再将 JRadioButton 类型的对象添加到按钮中。按钮组负责在新按钮被按下时,取消前一个被按下的按钮的选择状态。
ButtonGroup group = new ButtonGroup();
JRadioButton smallButton = new JRadioButton("Small", false);
group.add(smallButton);
构造器的第二个参数为true表明这个按钮初始状态是被选择,其他按钮构造器的这个参数为false。注意,按钮组仅仅控制按钮的行为,如果想把这些按钮组织在一起布局,需要把他们添加到容器中,如JPanel。
单选按钮的事件通知机制和其他的按钮一样。不同的是,每个单选按钮都对应一个不同监听器对象。每个监听器对象都做不同的事件。

package radioButton;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RadioButton extends JFrame{
    private static final long serialVersionUID = 1L;

    public static void main(String[] args){
        RadioButton radioButton = new RadioButton();
        radioButton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        radioButton.setVisible(true);
    }

    private JPanel buttonPanel;
    private ButtonGroup group;
    private JLabel label;
    private static final int DEFAULT_SIZE = 36;
    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;

    public RadioButton(){
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        label = new JLabel("Today is a sad day...");
        label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));
        add(label, BorderLayout.CENTER);        //将标签添加到框架的中间

        buttonPanel = new JPanel();
        group = new ButtonGroup();

        addRadioButton("Small", 8);
        addRadioButton("Medium", 12);
        addRadioButton("Large", 18);
        addRadioButton("Extra large", 36);

        add(buttonPanel, BorderLayout.SOUTH);
    }

    /**
     * @param name ——要添加按钮的名称
     * @param size ——这个按钮要设置的字体大小
     */
    public void addRadioButton(String name, final int size){
        boolean selected = size == DEFAULT_SIZE;
        JRadioButton button = new JRadioButton(name, selected);
        group.add(button);
        buttonPanel.add(button);

        ActionListener listener = new ActionListener(){
            public void actionPerformed(ActionEvent event){
                label.setFont(new Font("Serif", Font.PLAIN, size));
            }
        };

        button.addActionListener(listener);
    }
}
  • JRadioButton(String label, Icon icon)
    构造一个单选按钮,初始没有被选择
  • JRadioButton(String label, boolean state)
    用给定的标签和初始状态构造一个单选按钮
  • void add(AbstractButton b)
    将按钮添加到组中
  • ButtonModel getSelection()
    返回被选择的按钮的按钮模型
  • String getActionCommand()
    返回按钮模型的动作命令
  • void setActionCommand(String s)
    设置按钮及其模型的动作命令

边框

用来指出哪些按钮属于同一组。

  • 调用 BorderFactory 的静态方法创建边框。有几种风格:凹斜面、凸斜面、蚀刻、直线、蒙版。
  • 如果愿意,可以给边框加标题,具体的实现方法是将边框传递给:BorderFactory.createTitledBorder
  • 如果确实想把一切凸显出来,可以调用下面的方法将几种边框组合起来使用:BorderFactory.createCompoundBorder
  • 调用JComponent类中的setBorder方法将结果边框添加到组件中。

下面代码说明了如何把一个带有标题的蚀刻边框添加到一个面板上
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder(etched, "A Title");
panel.setBorder(titled)

package border;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderFrame extends JFrame{
    private static final long serialVersionUID = 1L;
    public static void main(String[] args){
        BorderFrame borderFrame = new BorderFrame();
        borderFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        borderFrame.setVisible(true);
    }

    private JPanel demoPanel;
    private JPanel buttonPanel;
    private ButtonGroup group;
    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;

    public BorderFrame(){
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        demoPanel = new JPanel();
        buttonPanel = new JPanel();
        group = new ButtonGroup();

        addRadioButton("Lowered bevel", BorderFactory.createLoweredBevelBorder());
        addRadioButton("Raised bevel", BorderFactory.createRaisedBevelBorder());
        addRadioButton("Etched", BorderFactory.createEtchedBorder());
        addRadioButton("Line", BorderFactory.createLineBorder(Color.BLUE));
        addRadioButton("Matte", BorderFactory.createMatteBorder(10, 10, 10, 10, Color.BLUE));
        addRadioButton("Empty", BorderFactory.createEmptyBorder());

        Border etched = BorderFactory.createEtchedBorder();
        Border titled = BorderFactory.createTitledBorder(etched, "Border types");
        buttonPanel.setBorder(titled);

        setLayout(new GridLayout(2, 1));
        add(buttonPanel);
        add(demoPanel);
    }

    public void addRadioButton(String buttonName, final Border b){
        JRadioButton button = new JRadioButton(buttonName);
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                demoPanel.setBorder(b);
            }
        });
        group.add(button);
        buttonPanel.add(button);
    }
}

在这里插入图片描述

  • static Border CreateLineBorder(Color color, int thicksness)
    创建一个简单的直线边框
  • static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Icon titleIcon)
    创建一个用 color 颜色或一个重复图标填充的粗的边框。
  • static Border createEmptyBorder(int top, int left, int bottom, int right)
    创建一个空白边框
  • static Border createEtchedBorder(int type, Color highlight, Color shadow)
    创建一个具有3D效果的直线边框
    hightlight, shadow : 用于3D效果的颜色
    type: EtchedBorder.RAISED 和 EtchedBorder.LOWERED之一
  • static Border createRaisedBevelBorder()
    创建一个具有凹面或凸面效果的边框
    type : BevelBorder.LOWERED 和 BevelBorder.RAISED之一
    highlight, shadow : 用于3D效果的颜色
  • static TitledBorder createTitledBorder(Border border, String title, int justification, int position, Font font, Color color)
    创建一个具有给定特性的带标题的边框
    title :标题字符串
    border :用标题装饰的边框
    justification : TitledBorder 常量LEFT, CENTER, RIGHT, LEADING, trAILING,或DEFAULT_JUSTIFICATION之一。
    position: TitledBorder 常量ABOVE_TOP,TOP,BELOW_TOP,ABOVE_BOTTOM,BOTTOM,BELOW_BOTTOM 或 DEFAULT_POSITION之一。
    font :标题的字体
    color :标题的颜色
  • static CompoundBorder createCompoundBorder(Border outsideBorder, Border insideBorder)
    将两个边框组合成一个新的边框
  • SoftBevelBorder(int type, Color hightlight, Color shadow)
    创建一个带有柔和边角的斜面边框
    type :BevelBorder.LOWERED 和 BevelBorder.RAISED 之一
    hight, shadow :用于3D效果的颜色
  • public LineBorder(Color color, int thickness, boolean roundedCorners)
    用指定的颜色和粗细创建一个直线边框。如果roundedCorners为true,则边框具有圆角。
  • void setBorder(Border border)
    设置这个组件的边框

组合框

当多个选择时没使用单选按钮会占用较大的空间,这时可以使用组合框。当用户点击这个组件时,选择列表会下拉出来,并且下拉的列表还可以设置成被编辑(调用setEditable方法),编辑只会影响当前项,不会改变列表的内容。

  • 可以调用addItem方法增加选项。这个方法将字符串添加到列表的尾部。
    JComboBox< String > faceCombo = new JComboBox<>();
    faceCombo.addItem("Serif");
    faceCombo.addItem("SanSerif");

  • 利用insertItemAt方法在列表的任何位置插入一个新选项。可以增加任何类型的选项,组合框可以调用每个选项的 toString 方法显示内容。
    faceCombo.insertItemAt("Monospaced", 0)

  • 可以使用 removeItem 或者 removeItemAt方法,使用哪个方法取决于参数提供的是选项内容还是位置
    faceCombo.removeItem("Monospaced");
    faceCombo.removeItemAt(0);

  • 调用 removeAllItems 方法将立即移除所有的选项。

package comboBox;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ComboBoxFrame extends JFrame{
    private static final long serialVersionUID = 1L;
    
    public static void main(String[] args){
        ComboBoxFrame comboBox = new ComboBoxFrame();
        comboBox.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        comboBox.setVisible(true);
    }

    private JComboBox<String> faceCombo;
    private JLabel label;
    private static final int DEFAULT_SIZE = 24;
    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;

    public ComboBoxFrame(){
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

        label = new JLabel("Today is a rain day..");        
        label.setFont(new Font("Serif", Font.PLAIN, DEFAULT_SIZE));     //设置标签字体
        add(label, BorderLayout.CENTER);        //将标签添加到框架的中间

        faceCombo = new JComboBox<>();
        faceCombo.addItem("Serif");
        faceCombo.addItem("SansSerif");
        faceCombo.addItem("Monospaced");
        faceCombo.addItem("Dialog");
        faceCombo.addItem("DialogInput");

        faceCombo.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                label.setFont(new Font(faceCombo.getItemAt(faceCombo.getSelectedIndex()),
                            Font.PLAIN, DEFAULT_SIZE)); 
            }
        });

        JPanel comboPanel = new JPanel();       //为复选框添加画板
        comboPanel.add(faceCombo);
        add(comboPanel, BorderLayout.SOUTH);
    }
}

在这里插入图片描述

  • void setEditable(boolean b)
    获取或设置组合框的可编辑特性
  • void addItem(Object item)
    把一个选项添加到选项列表中
  • void insertItemAt(Object item, int index)
    将一个选项添加到选项列表的指定位置
  • void removeItem(Object item)
    从选项列表中删除一个选项
  • void removeAllItems()
    从选项列表中删除所有选项
  • void removeItemAt(int index)
    删除指定位置的选项
  • Object getSelectedItem()
    返回当前选择的选项

滑动条

组合框可以让用户从一组离散值中进行选择,滑动条允许进行连续值的选择。
通常,用下面的方式构造滑动条:
JSlider slider = new JSlider(min, max, initialValue);
如果省略最小值、最大值和初始值,其默认值分别为0, 100,50.
按照下面的方式构造垂直滑动条:
JSlider slider = new JSlider(SwingConstants.VERTICAL, min, max, initialValue);

当用户的滑动条滑动时,滑动条对应的值也在变化,ChangeEvent 就会发送给所有变化的监听器。为了得到这些改变的通知,需要调用 addChangeListener 方法并且安装一个实现了ChangeListener接口的对象。这个接口只有y一个方法 StateChanged。在这个方法中可以获得滑动条的当前值。

public void stateChanged(ChangeEvent event){
	JSlider slider = (JSlider) event.getSource();
	int value = slider.getValue();
	...
}

为滑动条显示标尺:

slider.setMajorTickSpacing(20);    // 每20个单位的位置显示一个大标尺标记
slider.setMinorTickSpacing(5);      // 每5个单位的位置显示一个小标尺标记

将他们显示出来:

slider.setPaintTicks(true);

强制滑动条对其标尺:

slider.setSnapToTicks(true);

为大标尺添加标尺标记标签:

slider.setPaintLabels(true);

将标尺标签设置为A,B,C,D,E,F:

Hashtable<Integr, Component> labelTabel = new Hashtable<Integr, Component>();
labelTable.put(0, new JLabel("A"));
labelTable.put(20, new JLabel("B"));
...
labelTable.put(100, new JLabel("F"));
slider.setLabelTable(labelTable);
样例程序
package slider;

import java.awt.*;
import javax.swing.event.*;
import javax.swing.*;
import java.util.*;

public class SliderFrame extends JFrame{
    private static final long serialVersionUID = 1L;
    public static void main(String[] args){
        SliderFrame sliderFrame = new SliderFrame();
        sliderFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sliderFrame.setVisible(true);
    }
    private JPanel sliderPanel;
    private JTextField textField;
    private ChangeListener listener;
    private static final int DEFAULT_WIDTH = 700;
    private static final int DEFAULT_HEIGHT = 500;

    public SliderFrame() {
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        
        sliderPanel = new JPanel();
        sliderPanel.setLayout(new GridBagLayout());

        listener = new ChangeListener(){
            public void stateChanged(ChangeEvent event) {
                JSlider source = (JSlider) event.getSource();
                textField.setText("" + source.getValue());
            }
        };

        JSlider slider = new JSlider();
        addSlider(slider, "Plain");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        addSlider(slider, "Ticks");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setSnapToTicks(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        addSlider(slider, "Snap to ticks");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setPaintTrack(false);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        addSlider(slider, "No track");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setInverted(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        addSlider(slider, "Inverted");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        addSlider(slider, "Labels");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(5);
        
        Dictionary<Integer, Component> labelTable = new Hashtable<>();
        labelTable.put(0, new JLabel("A"));
        labelTable.put(20, new JLabel("B"));
        labelTable.put(40, new JLabel("C"));
        labelTable.put(60, new JLabel("D"));
        labelTable.put(80, new JLabel("E"));
        labelTable.put(100, new JLabel("F"));

        slider.setLabelTable(labelTable);
        addSlider(slider, "Custom labels");

        slider = new JSlider();
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setSnapToTicks(true);
        slider.setMajorTickSpacing(20);
        slider.setMinorTickSpacing(20);

        labelTable = new Hashtable<Integer, Component>();
        labelTable.put(0, new JLabel(new ImageIcon("nine.gif")));
        labelTable.put(20, new JLabel(new ImageIcon("ten.gif")));
        labelTable.put(40, new JLabel(new ImageIcon("jack.gif")));
        labelTable.put(60, new JLabel(new ImageIcon("queen.gif")));
        labelTable.put(80, new JLabel(new ImageIcon("king.gif")));
        labelTable.put(100, new JLabel(new ImageIcon("ace.gif")));

        slider.setLabelTable(labelTable);
        addSlider(slider, "Icon labels");

        textField = new JTextField();
        add(sliderPanel, BorderLayout.CENTER);
        add(textField, BorderLayout.SOUTH);
    }

    public void addSlider(JSlider s, String description){
        s.addChangeListener(listener);
        JPanel panel = new JPanel();
        panel.add(s);
        panel.add(new JLabel(description));
        panel.setAlignmentX(Component.LEFT_ALIGNMENT);
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridy = sliderPanel.getComponentCount();
        gbc.anchor = GridBagConstraints.WEST;
        sliderPanel.add(panel, gbc);
    }
}

在这里插入图片描述

  • JSlider(int direction, int min, int max, int initialValue)
    用给定的方向、最大值、最小值和初始化值构造一个水平滑动条
    direction :SwingConstants.HORIZONTAL 或 SwingConstants.VERTICAL 之一。默认为水平
    min, max :滑动条的最小值、最大值。默认为0到99
    initialValue :滑动条的初始化值。默认值是50
  • void setPaintTicks(boolean b)
    如果 b 为true,显示为标尺
  • void setMinorTickSpacing(int units)
    用给定的滑动条单位的倍数设置大标尺和小标尺
  • void setPaintLabels(boolean b)
    如果 b 是true,显示标尺标签
  • void setLabelTable(Dictionary table)
    设置用于作为标尺标签的组件。表中的每一个键/值对都采用 new Integer(value) / component的格式。
  • void setSnapToTicks(boolean b)
    如果 b 是 true,每一次调整后滑块都要对齐到最接近的标尺处
  • void setPaintTrack(boolean b)
    如果 b 是 true,显示滑动条滑动的轨迹
发布了176 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43207025/article/details/104254969