文章目录

  • 组件
  • 背景组件
  • 交互组件
  • 布局管理器
  • BorderLayout
  • 按钮放在东边
  • 按钮放在北边
  • 东南西北中各放一个按钮
  • FlowLayout
  • BoxLayout
  • 常用swing组件
  • JTextField
  • JTextArea
  • 没有垂直滚动条的JTextArea
  • 有垂直滚动条的JTextArea
  • JCheckBox
  • JList


组件

所有组件都继承自javax.swing.JComponent
任意组件上都可以放置组件,但大部分情况下,交互组件会放在框架、面板等背景组件上。

背景组件

比如,框架 JFrame、 面板JPanel

交互组件

比如,按钮JButton、复选框JCheckBox、文本输入框JTextField

布局管理器

框架有自己的布局管理器,面板有自己的布局管理器。

BorderLayout

BorderLayout是框架JFrame默认的布局管理器,该管理器会把背景组件分成5个区域:EAST|SOUTH|WEST|NORTH|CENTER,且每个区域只能放一个组件。

java控件有哪些 java控件的添加与布局_java

按钮放在东边
import javax.swing.*;
import java.awt.*;

public class Test{
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JButton button = new JButton("click me");
//        JButton button  = new JButton("do u dare to click me?");
        frame.getContentPane().add(BorderLayout.EAST,button);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

java控件有哪些 java控件的添加与布局_java_02

按钮放在北边
import javax.swing.*;
import java.awt.*;

public class Test{
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JButton button = new JButton("click me");
//        Font bigFont = new Font("serif",Font.BOLD,32);
//        button.setFont(bigFont);

        frame.getContentPane().add(BorderLayout.NORTH,button);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

java控件有哪些 java控件的添加与布局_布局管理器_03

东南西北中各放一个按钮
import javax.swing.*;
import java.awt.*;

public class Test{
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();

        JButton btn_east = new JButton("btn_east");
        JButton btn_west = new JButton("btn_west");
        JButton btn_south = new JButton("btn_south");
        JButton btn_north = new JButton("btn_north");
        JButton btn_center = new JButton("btn_center");

        frame.getContentPane().add(BorderLayout.EAST,btn_east);
        frame.getContentPane().add(BorderLayout.WEST,btn_west);
        frame.getContentPane().add(BorderLayout.SOUTH,btn_south);
        frame.getContentPane().add(BorderLayout.NORTH,btn_north);
        frame.getContentPane().add(BorderLayout.CENTER,btn_center);

        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

java控件有哪些 java控件的添加与布局_java控件有哪些_04


先给南北方向的按钮分配空间,再给东西方向的按钮分配空间,最后剩下的空间给中间按钮。

FlowLayout

FlowLayout是面板JPanel默认的布局管理器,该管理器会按照组件加入的顺序,将组件从左到右、从上到下(发生换行时) 排列。

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

public class Test{
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setBackground(Color.darkGray);

        JButton button = new JButton("shock me");
        panel.add(button);

        JButton button2 = new JButton("bliss");
        panel.add(button2);

        frame.getContentPane().add(BorderLayout.EAST,panel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

java控件有哪些 java控件的添加与布局_java_05

BoxLayout

BoxLayout这个布局管理器会按照组件加入的顺序将组件垂直排列,从上到下,每行一个。

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

public class Test{
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setBackground(Color.darkGray);
        panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
        JButton button = new JButton("shock me");
        JButton button2 = new JButton("bliss");
        panel.add(button);
        panel.add(button2);
        frame.getContentPane().add(BorderLayout.EAST,panel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

java控件有哪些 java控件的添加与布局_Test_06

  • setLayout() 改变布局管理器
  • new BoxLayout(component,axis) BoxLayout布局管理器使用哪个轴管理哪个组件

常用swing组件

JTextField
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test{
    JTextField field;
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel label = new JLabel("Enter some text:");
        field = new JTextField(15);
        field.addActionListener(new FieldActionListener());
        panel.add(label);
        panel.add(field);
        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setSize(360,150);
        frame.setVisible(true);
    }
    public class FieldActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            String res = field.getText();
            System.out.println("get text:"+res);
        }
    }
}

java控件有哪些 java控件的添加与布局_Test_07


文本输入完毕,按下回车键,将触发ActionEvent事件,并调用事件处理方法actionPerformed

JTextArea
没有垂直滚动条的JTextArea
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test{
    JTextArea field;
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel label = new JLabel("个人简介:");
        field = new JTextArea(10,20);
        JButton button = new JButton("submit");
        button.addActionListener(new FieldActionListener());
        panel.add(label);
        panel.add(field);
        panel.add(button);
        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setSize(360,360);
        frame.setVisible(true);
    }
    public class FieldActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            String res = field.getText();
            System.out.println("get text:"+res);
        }
    }
}

java控件有哪些 java控件的添加与布局_布局管理器_08

有垂直滚动条的JTextArea
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test{
    JTextArea field;
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JLabel label = new JLabel("个人简介:");
        field = new JTextArea(10,15);
        field.setLineWrap(true);
        JScrollPane scroller = new JScrollPane(field);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        JButton button = new JButton("submit");
        button.addActionListener(new FieldActionListener());
        panel.add(label);
        panel.add(scroller);
        panel.add(button);
        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
    public class FieldActionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            field.append("hello world\n");
        }
    }
}

java控件有哪些 java控件的添加与布局_java_09

  • setLineWrap(true) 启动自动换行
  • setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) 使用垂直滚动条
  • setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) 不使用水平滚动条
JCheckBox
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Test{
    JCheckBox red;
    JCheckBox green;
    JCheckBox blue;
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
        red = new JCheckBox("红");
        red.addItemListener(new RedCheckBoxListener());
        green = new JCheckBox("绿");
        green.addItemListener(new GreenCheckBoxListener());
        blue = new JCheckBox("蓝");
        blue.addItemListener(new BlueCheckBoxListener());
        panel.add(red);
        panel.add(green);
        panel.add(blue);
        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
    public class RedCheckBoxListener implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(red.isSelected()){
                System.out.println("red is selected");
            }else{
                System.out.println("red is not selected");
            }
        }
    }
    public class GreenCheckBoxListener implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(green.isSelected()){
                System.out.println("green is selected");
            }else{
                System.out.println("green is not selected");
            }
        }
    }
    public class BlueCheckBoxListener implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(blue.isSelected()){
                System.out.println("blue is selected");
            }else{
                System.out.println("blue is not selected");
            }
        }
    }
}

java控件有哪些 java控件的添加与布局_布局管理器_10

JList
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;

public class Test{
    JList list;
    public static void main(String[] args){
        Test test = new Test();
        test.go();
    }
    public void go(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        String[] listEntries = {"apple","banana","tomato","watermelon","grape","pear","orange"};
        list = new JList(listEntries);
        list.setVisibleRowCount(4);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addListSelectionListener(new ListListener());
        JScrollPane scroller = new JScrollPane(list);
        scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        panel.add(scroller);
        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
    public class ListListener implements ListSelectionListener{

        @Override
        public void valueChanged(ListSelectionEvent e) {
            String selection = (String) list.getSelectedValue();
            System.out.println(selection);
        }
    }
}

java控件有哪些 java控件的添加与布局_java_11

选择一个选项时,会输出两次,所以在事件处理方法中加上这么一个限制条件:e.getValueIsAdjusting()

public class ListListener implements ListSelectionListener{

        @Override
        public void valueChanged(ListSelectionEvent e) {
            if(!e.getValueIsAdjusting()){
                String selection = (String) list.getSelectedValue();
                System.out.println(selection);
            }
        }
    }

java控件有哪些 java控件的添加与布局_java控件有哪些_12

  • setVisibleRowCount(4) 设置列表显示的函数
  • setSelectionMode(ListSelectionModel.SINGLE_SELECTION) 限制用户只能从列表中选择一个项目