文章目录
- 组件
- 背景组件
- 交互组件
- 布局管理器
- 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
,且每个区域只能放一个组件。
按钮放在东边
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);
}
}
按钮放在北边
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);
}
}
东南西北中各放一个按钮
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);
}
}
先给南北方向的按钮分配空间,再给东西方向的按钮分配空间,最后剩下的空间给中间按钮。
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);
}
}
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);
}
}
-
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);
}
}
}
文本输入完毕,按下回车键,将触发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);
}
}
}
有垂直滚动条的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");
}
}
}
-
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");
}
}
}
}
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);
}
}
}
选择一个选项时,会输出两次,所以在事件处理方法中加上这么一个限制条件: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);
}
}
}
-
setVisibleRowCount(4)
设置列表显示的函数 -
setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
限制用户只能从列表中选择一个项目