一:Java swing 概述
Java swing是java用来进行开发桌面程序的API,在包javax.swing中,其包含关系如下图所示
在Swing组件中大多数GUI组件都是Component类的直接子类或间接子类,JComponent类是Swing组件各种特效的存放位置,这些组件的特效包括设定组件边界、GUI组件自动滚动等
注意容器与组件的概念与区别:组件位于容器内部,容器通常调用方法add将组件添加到内部,容器内部也可以添加容器(容器之间的嵌套),添加的组件需要调用方法validate让其在容器内显示出来,默认时不显示的。
二:窗口
1:概述
容器分为底层容器,中间容器以及顶层容器,窗口属于底层容器。Java提供的JFrame类的实例就是一个窗口。还有一种底层容器就是JDlalog类的实例(对话框)。二者无太大区别。可以将组件(顶层)添加到窗口中,但是不允许窗口添加到容器中。
2:JFrame常用方法
1:JFrame() //创建一个无标题的窗口
2: JFrame(String s) //创建一个标题为s的窗口
3: public void setBounds(int a,int b,int width,int height) //设置窗口的初始位置为(a,b),宽度高度。
4: public void setSize(int width,int height) //设置窗口的大小
5: public void setLocation(int x,int y) //设置窗口的位置,默认是0,0
6: public void setVisible(boolean b) //设置窗口是否可见默认不可见
7: public void setResizable(boolean b) //设置窗口是否可调整大小
8: public void dispose() //撤销当前窗口并且释放所有资源
9: public void setExtendedState(int state) //设置窗口的宽展状态
10: public void setDefaultCloseOperation(int operation) //点击关闭图标后,程序的处理
//默认值如下:
DO_NOTHING_ON_CLOSE //什么也不做
HIDE_ON_CLOSE //隐藏当前窗口
DISPOSE_ON_CLOSE //隐藏窗口,并且释放资源
EXIT_ON_CLOSE //结束窗口内的应用程序
例如:
package cn.Test.swing;
import javax.swing.*;
public class FrameDemo {
public static void main(String[] args) {
JFrame jFrame=new JFrame("窗口实例"); //新建一个窗口,标题为窗口实例
jFrame.setSize(400,300); //设置窗口的宽高
jFrame.setLocationRelativeTo(null); //设置窗口位置位于屏幕的正中心
jFrame.setResizable(false); //设置窗口大小不能随意改变
jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //设置关闭窗口同时结束进程
jFrame.setVisible(true); //设置窗口可以显示
}
}
运行结果如下图所示:
此窗口位于屏幕正中央,且不可被改变大小。
3:菜单条,菜单,菜单项
菜单条,菜单,菜单项是窗口常用的组件,三者的关系为菜单放在菜单条里,菜单项放在菜单里。
(1)、菜单条:JMenubar的一个实例就是菜单条。JFrame类可以通过方法setJMenuBar将菜单条放置到窗口中:
setJMenuBar(JMenuBar bar); //将菜单条放置到窗口顶部,且一个窗口只能有一个菜单条
(2)、菜单:JMenu的一个实例就是菜单
(3)、菜单项:JMenuItem的实例就是一个菜单项
(4)、嵌入子菜单:把菜单添加到菜单中就构成了嵌入子菜单。
(5)、菜单图标:图表类icon声明,后用imageicon创建图标最后菜单项调用setIcon设置图标。
例如:
package cn.Test.swing;
import javax.swing.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import static javax.swing.JFrame.*;
public class WindowMenu extends JFrame { //JFrame的子类
JMenuBar jMenuBar;
JMenu menu,subMenu;
JMenuItem item1,item2;
public WindowMenu(){}
public WindowMenu(String s,int x,int y,int w,int h){
init(s);
setLocation(x,y);
setSize(w,h);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
void init(String s){
setTitle(s);
jMenuBar=new JMenuBar();
menu=new JMenu("菜单");
subMenu=new JMenu("软件项目");
item1=new JMenuItem("java话题",new ImageIcon("a.gif"));
item2=new JMenuItem("动画话题",new ImageIcon("b.gif"));
item1.setAccelerator(KeyStroke.getKeyStroke('A'));
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
menu.add(item1);
menu.addSeparator();
menu.add(item2);
menu.add(subMenu);
subMenu.add(new JMenuItem("汽车系统",new ImageIcon("c.gif")));
subMenu.add(new JMenuItem("内存系统",new ImageIcon("d.gif")));
jMenuBar.add(menu);
setJMenuBar(jMenuBar);
}
}
三:常用组件与布局
1:常用组件
(1):JTextField(文本框)
允许用户在文本框中输入单行文本
(2):JTextArea(文本区)
允许用户在文本区输入多行数据
(3):JButton(按钮)
允许用户点击按钮
(4):JLable(标签)
标签为用户提供提示信息
(5):JCheckBox(复选框)
为用户提供多项选择
(6):JRadioButton(单选按钮)
为用户提供单项选择
(7):JComboBox(下拉列表)
为用户提供下拉式的单项选择
(8):JPassworFiled(密码框)
允许用户体提供单行密码
2:常用容器(中间容器)
介于底层容器窗口与各中组件的一种容器,组件可以添加在里面。常用的中间容器有:
(1):JPanel(面板)
JPangle创建一个面板,然后向其中添加组件,最后将面板添加到底层容器中,默认的面板布局是FlowLayout布局
(2):JTabbePane(选项卡窗格)
向选项卡窗格添加组件时,容器会自动为该组件指定一个对应的选项卡,即一个选项卡对应一个组件。且组件为层叠样式放入容器。点击选项卡,显示对应的组件,可以使用add(String text,Component c)
方法将组件添加到容器内,text是选项卡的提示选项。选项卡的位置可以通过调用方法:public JTabbedPane(int tabPalacement)
确定其位置,取值为:JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RIGHT.
(3):JScollPane(滚动窗格)
滚动窗格中只能添加一个组件,可以把一个文本框放入滚动窗格中,例如:
JScrollPane scroll = new JScrollPane(next JTextArea())
(4):JSplitPane(拆分窗格)
将容器划分为两部分,一部分里面可以放置一个组件。有两种划分方式;水平分割和垂直分割。分割线可以移动。他的两个常用构造方法为:
JScrollPane(int n,Component c,Component b)
其中参数n有两种取值,分别是HORIZONTAL_SPLIT与VERTICAL_SPLIT分别代表水平分割与垂直分割。其他两个为组件。
JScrollPane(int n,int b,Component c,Component b)
比起第一种,多了参数b,决定拆分线移动时,组件是否跟着移动。
(5):JLayeredPane(分层窗格)
它调用方法add(Jcomponent com,int layer)
将组件加入到容器内部。参数分别为组件与位置。
3:常用布局
(1):FlowLayout布局
构造一个居中对齐的布局方式:FlowLayout()
,add方法将组件添加到容器内,组件之间默认间隔5个像素。在此布局中的组件改变㢟大小时,需要调用方法:public void setPreferredSize(Dimension preferredSize)
。居中对其方式可以改变,调用方法:SetAlignment(int aligan),aligan有三种取值FlowLayout.LEFT、FlowLayout.CENTER、FlowLayout.RIGHT。
(2):BorderLayout布局
次布局将容器划分为5个区域:东南西北中。中间最大,一个区域只能放置一个组件。调用方法:
con.add(b,BorderLayout.CENTER);
b为组件,第二个参数决定了放置区域的位置。
(3):CardLayout布局
可以容纳多个组件,但是每个组件被层叠放入容器内,同一时刻只能显示一个组件创建一个CardLayout步骤如下:
- 创建CardLayout布局对象
CardLayout card = new CardLayout();
- 使用容器的setLayout() 方法为容器设置布局
- 调用add(String s,Component b)将组件加入到容器内,并且给出该组件的代号。
- 调用方法show(con,s),显示代号为s的组件。
(4):GridLayout布局
基本布局策略为把容器划分为若干行和若干列相乘的网格区域。组件位于小格内。
(5):null布局
自己定义组件在容器内的位置。往null布局内添加组件需要分两步:
调用add方法将组件添加到容器内。
调用setBounds(int a,int b,int width,int height)确定组件的位置和大小。a,b指的是据容器p的位置。
(6):BoxLayout布局
盒容器布局,可以嵌套。
例:
test.java
public class Test {
public static void main(String[] args) {
new ShowLayout();
}
}
ShowLayout.java
import javax.swing.*;
import java.awt.*;
public class ShowLayout extends JFrame{
PanelGridLayout panelGrid;
PanelNullLayout panelNull;
JTabbedPane p; //选项卡布局
ShowLayout(){
panelGrid=new PanelGridLayout();
panelNull=new PanelNullLayout();
p=new JTabbedPane();
String Grid_name="网格布局的面板";
p.add(Grid_name,panelGrid);
p.add("空白布局的面板",panelNull);
add(p,BorderLayout.CENTER);
add(new JButton("窗体是BorderLayout布局"),BorderLayout.NORTH);
add(new JButton("南"),BorderLayout.SOUTH);
add(new JButton("西"),BorderLayout.WEST);
add(new JButton("东"),BorderLayout.EAST);
setBounds(10,10,570,390);
setVisible(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
validate();
}
}
PanelGridLayout.java
import javax.swing.*;
import java.awt.*;
public class PanelGridLayout extends JPanel{
PanelGridLayout(){
GridLayout grid=new GridLayout(12,12);
setLayout(grid);
Label label[][]=new Label[12][12];
for (int i = 0; i <12; i++) {
for(int j=0;j<12;j++){
label[i][j]=new Label();
if((i+j)%2==0){
label[i][j].setBackground(Color.BLACK);
}
else {
label[i][j].setBackground(Color.WHITE);
}
add(label[i][j]);
}
}
}
}
PanelNullLayout.java
import javax.swing.*;
import java.awt.*;
public class PanelNullLayout extends JPanel{
JButton jButton;
JTextField textField;
PanelNullLayout(){
setLayout(null);
jButton=new JButton("确认");
textField=new JTextField();
add(textField);
add(jButton);
textField.setBounds(100,30,90,30);
jButton.setBounds(190,30,66,30);
}
}
运行结果: