目录
一、常见的组件名
名称 | 组件名 | 样式 |
---|---|---|
窗体 | JFrame | |
对话框 | JDialog | |
面板 | JPanel | |
按钮 | JButton | |
标签 | JLabel | |
多选按钮 | JCheckBox | |
单选按钮 | JRadioButton | |
文本框 | JTextField | |
密码框 | JPassWord | |
下拉框 | JComBOX | |
文本域 | JTextArea | |
列表框 | JList | |
小对话框 | JOptionPane |
二、关于Swing你必须要知道的事
- 上面所提到的组件都是封装好的类,你可以通过new的形式创建对象后对上面的组件的属性进行获取或修改
- 除了通过对象来调用以上类的方法外,你也可以新建一个类来继承以上任意一个类,然后在构造器里直接就可以调用。下面举个栗子。
import javax.swing.*;
public class Demo {
JFrame f=new JFrame("我是一个窗体");//所有的组件都可以通过构造方法给组件取一个title
}
import javax.swing.*;
public class Demo extends JFrame {
public Demo(){
setTitle("我是一个窗体");//用继承的方法,直接在构造器里创建组件,所以用setTitle方法给组件添加标题
}
}
- 所有的组件都可以通过构造方法给组件取一个title,或者用setTitle方法。
- 所有的组件基本上都有相类似的get和set方法(或者干脆方法名一样,功能一样),设置属性统统用set,获取某个值统统用get。
- 一般的在创建窗体时都要先设置两个属性,一个是窗体是否可见,一个是窗体是否可关闭。下面会一一说到
三、你可能会需要用到的方法
*即泛指各种组件的名称
方法 | 功能 |
---|---|
J* *=new J*() | 创建一个组件 |
*.setTitle() | 设置组件的标题 |
*.setBounds() | 设置组件的位置和尺寸 |
*.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) | 设置窗体可关闭 |
*.setVisible(true) | 设置窗体可见 |
*.setLayout() | 设置组件的布局 |
c.setBackground(Color.WHITE) | 设置组件的背景颜色 |
*.setText() | 设置组件的内容 |
*.setFont(new Font(“微软雅黑”,Font.LAYOUT_LEFT_TO_RIGHT,16)) | 设置组件中的字体 |
*.add(*) | 添加组件到另一个组件中 |
下面具体讲解吧,感觉这样说不明白
创建窗体对象
JFrame f=new JFrame("窗体标题")
- 或者直接继承JFrame
设置窗体可见
f.setVisible(true);//设置窗体可见
设置窗体可关闭
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可以关闭
其中主要是EXIT_ON_CLOSE
这个参数
设置窗体大小和位置
f.setBounds(540,200,800,600);//设置窗口大小和位置
获取窗体容器
Container c=j.getContentpane();//获取窗体容器
2、修改容器背景颜色
c.setBackground(Color.BLUE);
创建标签
JLabel la=new JLabel("这是一个标签")
给窗体添加组件
c.add(la);//添加组件
2、删除组件
c.remove(la );//删除组件
3、验证容器中的组件(相当于刷新)
c.validate();
固定窗体大小,使其不可变
f.setResizable(false);
创建一个按钮
JButton btn=new JButton("按钮");
设置布局
c.setLayout(new FlowLayout());//设置布局为流布局
c.setLayout(null);//设置布局绝对布局
添加动作监听
组件名.addActionListener(使用匿名对象进行操作);//添加动作监听
JButton btn=new JButton("按钮");
btu.addActionListener(new ActionListener(){
public void actionperformed(ActionEvent e){
new Demo;//Demo是写好的方法
}
}
这个可以普遍用到很多组件上,都是调用addActionListener方法,然后使用匿名内部类的方式实现ActionListener接口,并重写他的actionperformed方法。
阻塞
1.需要写一个类来继承JFrame类,然后在super();中分别添加三个参数。第一个是父窗体;第二个是对话框标题;第三个是bool变量,为true则阻塞。
2.或者写两个方法,然后通过子窗体的构造器来完成阻塞。举个栗子。
我们用窗体和对话框来演示一遍。
需求就是:在窗体里有一个按钮,点击过后会弹出一个对话框(用到动作监听)。如果我们不加阻塞,则既可以操作父窗体也可以操作对话框,一直点按钮的话就会一直弹出对话框,如果你这样搞这个显然是会被老板抄鱿鱼的,因此必须加个阻塞。ok上代码。
未加阻塞:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo extends JDialog {
public void dialog(){
JDialog jDialog=new JDialog();//直接创建一个对话框。
jDialog.setTitle("我是一个对话框");
jDialog.setBounds(500,400,100,100);
jDialog.setVisible(true);
}
public void frame(){
JFrame f=new JFrame();
f.setTitle("父窗体");
f.setBounds(450, 180, 1000, 550);//设置窗体大小和位置
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体可关闭
Container c=f.getContentPane();
c.setBackground(Color.WHITE);//设置窗体的背景颜色
JButton jb=new JButton("弹出对话框");
jb.setBounds(450,180,100,50);
jb.addActionListener(new ActionListener() {//添加监听
@Override
public void actionPerformed(ActionEvent e) {
new DialogDemo().dialog();
}
});
c.add(jb);
f.setVisible(true);//设置窗体可见
}
public static void main(String[] args) {
new DialogDemo().frame();
}
}
结果:
加阻塞:
方法一:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo extends JDialog {
public DialogDemo(JFrame f){
super(f,"我是一个对话框",true);//方法一:继承JDialog后在构造器中通过super(三个参数)来阻塞
setBounds(500,400,100,100);
setVisible(true);
}
public static void main(String[] args) {
JFrame f=new JFrame();
f.setTitle("父窗体");
f.setBounds(450, 180, 1000, 550);//设置窗体大小和位置
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体可关闭
Container c=f.getContentPane();
c.setBackground(Color.WHITE);//设置窗体的背景颜色
JButton jb=new JButton("弹出对话框");
jb.setBounds(450,180,100,50);
jb.addActionListener(new ActionListener() {//添加监听
@Override
public void actionPerformed(ActionEvent e) {
new DialogDemo(f);
}
});
c.add(jb);
f.setVisible(true);//设置窗体可见
}
}
方法二:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DialogDemo{
public void dialog(JFrame f){
JDialog jDialog=new JDialog(f,"我是一个对话框",true);//方法二,普通方法,通过调用有参构造器来阻塞
jDialog.setBounds(500,400,100,100);
jDialog.setVisible(true);
}
public void frame(){
JFrame f=new JFrame();
f.setTitle("父窗体");
f.setBounds(450, 180, 1000, 550);//设置窗体大小和位置
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体可关闭
Container c=f.getContentPane();
c.setBackground(Color.WHITE);//设置窗体的背景颜色
JButton jb=new JButton("弹出对话框");
jb.setBounds(450,180,100,50);
jb.addActionListener(new ActionListener() {//添加监听
@Override
public void actionPerformed(ActionEvent e) {
new DialogDemo().dialog(f);
}
});
c.add(jb);
f.setVisible(true);//设置窗体可见
}
public static void main(String[] args) {
new DialogDemo().frame();
}
}
焦点监听事件
组件名.addFocusListener(使用匿名对象进行操作);//添加动作监听
JButton btn=new JButton("按钮");
btu.addFocusListener(new FocusListener(){
public void focusGained(FocusEvent e){//组件获得焦点时调用的方法
}
public void focusLost(FocusEvent e){//组件失去焦点时调用的方法
}
}
这个可以普遍用到很多组件上,都是调用addFocusListener方法,然后使用匿名内部类的方式实现FocusListener接口,并重写他的focusGained方法和focusLost方法。
举个栗子:
import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class DialogDemo extends JDialog {
public void frame(){
JFrame f=new JFrame();
f.setTitle("测试");
f.setBounds(450, 180, 1000, 550);//设置窗体大小和位置
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体可关闭
Container c=f.getContentPane();
c.setBackground(Color.WHITE);//设置窗体的背景颜色
JTextField jt1=new JTextField();
jt1.setBounds(100,100,100,30);
jt1.addFocusListener(new FocusListener() {//焦点监听事件
@Override
public void focusGained(FocusEvent e) {
jt1.setBackground(Color.pink);//获得焦点时背景为粉红
}
@Override
public void focusLost(FocusEvent e) {//失去焦点时背景为灰色
jt1.setBackground(Color.GRAY);
}
});
JTextField jt2=new JTextField();
jt2.setBounds(100,140,100,30);
jt2.addFocusListener(new FocusListener() {//焦点监听事件
@Override
public void focusGained(FocusEvent e) {
jt2.setBackground(Color.pink);//获得焦点时背景为粉红
}
@Override
public void focusLost(FocusEvent e) {//失去焦点时背景为灰色
jt2.setBackground(Color.GRAY);
}
});
JTextField jt3=new JTextField();
jt3.setBounds(100,180,100,30);
jt3.addFocusListener(new FocusListener() {//焦点监听事件
@Override
public void focusGained(FocusEvent e) {
jt3.setBackground(Color.pink);//获得焦点时背景为粉红
}
@Override
public void focusLost(FocusEvent e) {//失去焦点时背景为灰色
jt3.setBackground(Color.GRAY);
}
});
c.add(jt1);
c.add(jt2);
c.add(jt3);
f.setVisible(true);//设置窗体可见
}
public static void main(String[] args) {
new DialogDemo().frame();
}
}
效果图:
有焦点的背景为粉红,没有焦点的背景为灰色
建议
学到这里之后建议大家去学学JTable
这个组件,因为本人能力有限,这个组件还在摸索中,写了很多bug。所有JTable
暂时不做介绍,以后再更新。
另外如果大家对Swing感兴趣的话推荐大家看一下xietansheng大神的swing合集,给大家放上传送门~~~Java Swing 图形界面开发(目录)