Java基础——GUI——Swing中常用容器和组件
1.swing中常用容器
(1)JFrame
常用方法:
-
1.构造方法: 2.设置窗体可见: 3.设置点击窗体的执行的操作:. 4.设置窗体的大小和位置 等价于上面两个方法 不管窗体多大,窗体运行起来都会出现在屏幕的中心 5.获取窗体容器: 在容器中添加和删除组件: 做完添加和删除之后最好刷新容器: 6.设置窗体是否可以改变大小: 7.设置窗体标题: 8.获取窗体的横纵坐标 横坐标: 纵坐标:
注意:在实际使用JFrame的时候,都是用自定义类来继承JFrame,然后在自定义类的构造方法中对窗体进行初始化
(2)JDialog
常用方法与上面类似
示例代码:保证弹出对话框后阻塞父窗体
package Demo01; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Demo extends JDialog{ public Demo(JFrame frame) { /* *第一个参数:父窗体对象 *第二个参数:对话框标题 * 第三个参数:是否阻塞父窗体 */ super(frame,"对话框",true); //获取对话框窗体容器 Container c = getContentPane(); //添加一个对话框 c.add(new JLabel("这是一个对话框")); //设置对话框窗体的坐标和大小 setBounds(100,100,100,100); } public static void main(String[] args) { //创建一个窗体 JFrame f = new JFrame("父窗体"); //设置窗体的坐标和大小 f.setBounds(50,50,300,300); //获取窗体f的容器 Container c = f.getContentPane(); //创建一个按钮 JButton btn = new JButton("弹出对话框"); //使用流布局设置布局 c.setLayout(new FlowLayout()); //将按钮添加到窗体中 c.add(btn); //设置窗体可见 f.setVisible(true); //设置窗体点击x号关闭程序 f.setDefaultCloseOperation(EXIT_ON_CLOSE); //对按钮添加监听事件 btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Demo dialog = new Demo(f); dialog.setVisible(true); } }); } }
2.Swing中常用组件
(1)JLabel
作用:在窗体上添加文字或图片
常用方法:
import java.awt.Container; import java.awt.Cursor; import java.awt.Font; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class MyJFrame extends JFrame { //创建标签的引用 private JLabel label01; private JLabel label02; //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("JLabel组件");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); label01 = new JLabel("你好"); label01.setSize(200,100); label01.setLocation(0,0); //字体的大小:以磅作为单位 //setFont是很多组件都有的 label01.setFont(new Font("微软雅黑", Font.BOLD, 40)); label02 = new JLabel(); label02.setSize(300,300); label02.setLocation(220,0); //在标签中添加图片 //图片本身的像素大小 > 标签的大小:只显示图片的一部分 //在实际开发中,我们会首先设计好界面,然后然后确定好图片的大小,用制图软件去改变图片的像素大小 label02.setIcon(new ImageIcon("前进.png")); //为鼠标进入标签区域变换形状 //Cursor类表示鼠标的各种形状,可以通过Cursor类的静态属性当作参数指定形状 label02.setCursor(new Cursor(Cursor.HAND_CURSOR)); //为标签添加tip提示框:即鼠标放在标签上,就会显示提示框 label02.setToolTipText("这是一个Tip"); container.add(label01); container.add(label02); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } }
(2)文本框JTextField和密码框JPasswordField
作用:输入单行文本或密码
常用方法:
import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class MyJFrame extends JFrame { //创建标签的引用 private JLabel userName_Label; private JLabel password_Label; private JTextField userName_TextField; private JPasswordField passwordField; private JButton login_Button; private JButton cancel_Button; //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("JLabel组件");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); //对6个组件进行实例化 userName_Label = new JLabel("用户名"); password_Label = new JLabel("密码"); userName_TextField = new JTextField(); passwordField = new JPasswordField(); login_Button = new JButton("登录"); cancel_Button = new JButton("取消"); //设置用户名标签的大小、位置、字体 userName_Label.setSize(70,40); userName_Label.setLocation(100,60); userName_Label.setFont(new Font("微软雅黑",Font.PLAIN,20)); //设置密码标签的大小、位置、字体 password_Label.setSize(70,40); password_Label.setLocation(100,160); password_Label.setFont(new Font("微软雅黑",Font.PLAIN,20)); //设置用户名输入框的大小、位置 userName_TextField.setSize(300,40); userName_TextField.setLocation(200,60); //设置文本输入框中的限制字符的个数,该方法对null布局不起作用 //只能输入5个字符(在非null布局下),但是每个字符的宽度不一样,该方法,以字符m为标准限制字符个数 userName_TextField.setColumns(5); //实现在用户名输入框中按下回车键时,光标切换到密码输入框中 userName_TextField.addActionListener(new ActionListener() { //文本框中使用频率最高的事件是按下回车键 @Override public void actionPerformed(ActionEvent e) { //将光标切换到密码框当中 passwordField.requestFocus(); } }); //设置密码输入框的大小、位置 passwordField.setSize(300,40); passwordField.setLocation(200,160); //设置密码输入框中的回显字符,即在密码框中显示的字符 passwordField.setEchoChar(*); //实现在密码输入框中按下回车后直接登录 passwordField.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { login_Button.doClick(); //点击按钮 } }); //设置登录按钮的大小和位置 login_Button.setSize(150,40); login_Button.setLocation(130,240); login_Button.setFont(new Font("微软雅黑",Font.PLAIN,20)); //模拟登录 login_Button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String userName = userName_TextField.getText(); String password = new String(passwordField.getPassword()); System.out.println("用户名:"+userName); System.out.println("密码:"+password); System.out.println("登录中。。。"); } }); //设置取消按钮的大小和位置 cancel_Button.setSize(150,40); cancel_Button.setLocation(320,240); cancel_Button.setFont(new Font("微软雅黑",Font.PLAIN,20)); //将6个组件添加到界面容器当中 container.add(userName_Label); container.add(password_Label); container.add(passwordField); container.add(userName_TextField); container.add(login_Button); container.add(cancel_Button); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } }
(3)文本区JTextArea
(4)复选框JCheckBox
复选框和按钮有一个共同的祖先:AbstractButton
常用方法:
复选框本身就是一个按钮,只要点在按钮区域点击哪里都是一样的,都会被选中
import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; public class MyJFrame extends JFrame { //作用一:检查框 private JCheckBox confirm_CheckBox; private JButton next_Button; //作用二: private String[] city_names; private JCheckBox[] cities_CheckBoxs; private JButton ok_Button; private JLabel cities_Label; //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("复选框演示");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); //对组件进行实例化 confirm_CheckBox = new JCheckBox("我已经阅读并接受条款"); next_Button = new JButton("下一步"); cities_Label = new JLabel(); city_names = new String[]{"北京","上海","广州","深圳"}; cities_CheckBoxs = new JCheckBox[city_names.length]; ok_Button = new JButton("提交"); //设置复选框的大小、位置、字体 confirm_CheckBox.setSize(250, 40); confirm_CheckBox.setLocation(30, 30); confirm_CheckBox.setFont(new Font("微软雅黑",Font.PLAIN,20)); //设置复选框选中按钮为可用状态,复选框未被选中为不可用状态 // confirm_CheckBox.addActionListener(new ActionListener() { // // @Override // public void actionPerformed(ActionEvent e) { // //复选框是否被选中 // boolean flag = confirm_CheckBox.isSelected(); // next_Button.setEnabled(flag); // } // }); confirm_CheckBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { //复选框是否被选中 boolean flag = confirm_CheckBox.isSelected(); next_Button.setEnabled(flag); } }); //设置按钮的大小、位置、字体、不可见 next_Button.setSize(100, 40); next_Button.setLocation(30, 80); next_Button.setFont(new Font("微软雅黑",Font.PLAIN,20)); next_Button.setEnabled(false); //设置标签 cities_Label.setSize(200, 40); cities_Label.setLocation(30, 150); cities_Label.setFont(new Font("微软雅黑",Font.PLAIN,20)); //设置复选框 for(int i=0;i<cities_CheckBoxs.length;i++) { cities_CheckBoxs[i] = new JCheckBox(city_names[i]); cities_CheckBoxs[i].setSize(70, 40); cities_CheckBoxs[i].setLocation(30+i*70,200); cities_CheckBoxs[i].setFont(new Font("微软雅黑",Font.PLAIN,18)); container.add(cities_CheckBoxs[i]); } //设置ok按钮 ok_Button.setSize(80, 40); ok_Button.setLocation(30, 250); ok_Button.setFont(new Font("微软雅黑",Font.PLAIN,20)); //模拟提交 ok_Button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String string = new String(); for(int i=0;i<cities_CheckBoxs.length;i++) { if(cities_CheckBoxs[i].isSelected()) { string = string + cities_CheckBoxs[i].getText()+" "; } } } }); //将6个组件添加到界面容器当中 container.add(confirm_CheckBox); container.add(next_Button); container.add(cities_Label); container.add(ok_Button); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } }
(5)单选按钮组件
待补充
(6)进度条组件
待补充
(7)列表框组件JList
常见方法:
1)创建列表框
列表框只是展示数据的窗口,我们看到的列表框的数据并不是来自于列表本身,这些数据来自于它所创建的数据容器
有三种可以传递给列表的数据容器
-
第一选择:ListModel(接口):我们可以定义它的实现类DefaultListModel传递给JList的构造方法 第二选择:Vector 第三选择:数组
import java.awt.Color; import java.awt.Container; import java.awt.Font; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; public class MyJFrame extends JFrame { private JLabel select_Label; private JList<String> left_List; //String[] leftData; //Vector<String> leftData; DefaultListModel<String> leftData; //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("创建列表框演示");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); //要传递给JList的数据容器 //leftData = new String[]{"关羽","赵云","黄忠","马超","魏延","张飞"}; //leftData =new Vector<String>(); //Vector并不能像数组一次性添加数据,必须通过add方法添加 //leftData.add("孙悟空"); //leftData.add("猪八戒"); //leftData.add("沙僧"); leftData = new DefaultListModel<String>(); leftData.addElement("孙悟空"); leftData.addElement("猪八戒"); leftData.addElement("沙僧"); //对组件进行实例化 select_Label = new JLabel("你准备带谁出征?"); //left_List = new JList<String>(leftData); //left_List = new JList<String>(); //left_List.setListData(leftData); //left_List = new JList<String>(leftData); left_List = new JList<String>(); left_List.setModel(leftData); //设置标签 select_Label.setSize(200, 40); select_Label.setLocation(30, 30); select_Label.setFont(new Font("微软雅黑",Font.PLAIN,20)); //设置列表 left_List.setSize(200, 240); left_List.setLocation(30, 80); left_List.setFont(new Font("微软雅黑",Font.PLAIN,20)); left_List.setBorder(BorderFactory.createLineBorder(Color.GRAY,1)); //将6个组件添加到界面容器当中 container.add(select_Label); container.add(left_List); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } }
2)操作列表框
(8)树形组件JTree
创建树形组件,只能是先添加根结点,然后再逐层去添加子节点
1)硬编码创建树形组件
此种方式用户不能新增,删除任何结点
import java.awt.Container; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; public class MyJFrame extends JFrame { private JTree familyTree; private JScrollPane family_JScrollPane; //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("创建列表框演示");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); //创建一个根节点 DefaultMutableTreeNode root = new DefaultMutableTreeNode("曹操"); DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("曹昂"); DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("曹丕"); DefaultMutableTreeNode a3 = new DefaultMutableTreeNode("曹植"); DefaultMutableTreeNode a4 = new DefaultMutableTreeNode("曹彰"); root.add(a1); root.add(a2); root.add(a3); root.add(a4); DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("曹睿"); DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("曹霖"); DefaultMutableTreeNode b3 = new DefaultMutableTreeNode("曹志"); a2.add(b1); a2.add(b2); a3.add(b3); DefaultMutableTreeNode c1 = new DefaultMutableTreeNode("曹芳"); b1.add(c1); //创建树形组件 familyTree = new JTree(root); familyTree.setFont(new Font("微软雅黑",Font.PLAIN,20)); //创建滚动面板 family_JScrollPane = new JScrollPane(familyTree); family_JScrollPane.setSize(300,250); family_JScrollPane.setLocation(30, 30); container.add(family_JScrollPane); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } }
2)动态创建树形组件
常用方法:
import java.awt.Container; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import javax.xml.transform.Templates; public class MyJFrame extends JFrame { private JTree dynTree; private JScrollPane dyn_JScrollPane; private DefaultMutableTreeNode rooTreeNode; private DefaultMutableTreeNode selectedNode; private JTextField nodeName_TextField; private JButton createButton; private JButton renameButton; private JButton deleteButton; private TreePath path; //用户选择的结点到根结点的路径 //在构造界面的时候就进行初始化界面 public MyJFrame() { init(); } //初始化界面 private void init() { //设置窗体 this.setSize(600,400);//设置窗体大小 this.setLocationRelativeTo(null);//设置窗体居中显示 this.setTitle("创建列表框演示");//设置窗体标题 this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置点击窗体x号时退出程序 Container container=this.getContentPane(); container.setLayout(null); //实例化组件 rooTreeNode = new DefaultMutableTreeNode("根节点"); //创建根节点 dynTree = new JTree(rooTreeNode); //创建一颗以rootTreeNode为根节点的树形组件 dyn_JScrollPane = new JScrollPane(dynTree); createButton = new JButton("新增"); deleteButton = new JButton("删除"); renameButton = new JButton("修改"); nodeName_TextField = new JTextField(); //设置树形组件 dynTree.setFont(new Font("微软雅黑",Font.PLAIN,18)); //设置树形组件的单选模式,只能同时被选中一个结点 //先获得树形组件的选择模型对象,然后选择对象模型的单选模式 dynTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); //为树形组件添加选中结点的监听器 dynTree.addTreeSelectionListener(new TreeSelectionListener() { //一旦用户选中结点的状态发生变化,立刻执行此方法 //用户必须两次选择的结点不同才会起作用,因为这样才代表结点状态改变 @Override public void valueChanged(TreeSelectionEvent e) { //当我们从树形组件上选择了一条结点的时候,那么从根结点到它的路径是确定的(因为是单继承) path = e.getPath(); //获得根节点到被选中的结点的唯一路径 } }); //设置滚动面板 dyn_JScrollPane.setSize(350, 250); dyn_JScrollPane.setLocation(200,30); dyn_JScrollPane.setFont(new Font("微软雅黑",Font.PLAIN,18)); //设置文本框 nodeName_TextField.setSize(80, 30); nodeName_TextField.setLocation(290,300); nodeName_TextField.setFont(new Font("微软雅黑",Font.PLAIN,18)); //设置新增按钮 createButton.setSize(80, 30); createButton.setLocation(290,300); createButton.setFont(new Font("微软雅黑",Font.PLAIN,18)); createButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { //获得树形组件中被选中的结点 //这个方法的返回值是Object类型,此处需要强制类型转换 selectedNode = (DefaultMutableTreeNode)dynTree.getLastSelectedPathComponent(); String nameString = nodeName_TextField.getText(); if(checkNode_or_checkInput(selectedNode,nameString)) { selectedNode.add(new DefaultMutableTreeNode(nameString)); //展开被选中结点的路径上的所有结点 dynTree.expandPath(path); //当我们给树形组件新增一个结点的时候,树形图上不会立刻显示新增的结点 //调用以下方法刷新树形组件 dynTree.updateUI(); //创建之后清空文本域 nodeName_TextField.setText(""); } } }); //设置删除按钮 deleteButton.setSize(80, 30); deleteButton.setLocation(380,300); deleteButton.setFont(new Font("微软雅黑",Font.PLAIN,18)); deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { selectedNode = (DefaultMutableTreeNode)dynTree.getLastSelectedPathComponent(); if(selectedNode == null) { System.out.println("请选中一个结点"); return; } if(selectedNode.isRoot()) { System.out.println("不能删除根节点哦"); return; } selectedNode.removeFromParent(); dynTree.updateUI(); } }); //设置修改按钮 renameButton.setSize(80, 30); renameButton.setLocation(470,300); renameButton.setFont(new Font("微软雅黑",Font.PLAIN,18)); renameButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { //获得树形组件中被选中的结点 //这个方法的返回值是Object类型,此处需要强制类型转换 selectedNode = (DefaultMutableTreeNode)dynTree.getLastSelectedPathComponent(); String nameString = nodeName_TextField.getText(); //不将上述两行代码进行封装的原因是因为上面两行是采集数据,而checkNode_or_checkInput是验证数据 //从逻辑上来说,我们不应该把采集数据和验证数据放在一个功能中 if(checkNode_or_checkInput(selectedNode,nameString)){ selectedNode.setUserObject(nameString); dynTree.updateUI(); //修改之后清空文本域 nodeName_TextField.setText(""); } } }); //设置文本域 nodeName_TextField.setSize(80, 30); nodeName_TextField.setLocation(200,300); nodeName_TextField.setFont(new Font("微软雅黑",Font.PLAIN,18)); //将组件添加到容器中 container.add(dyn_JScrollPane); container.add(createButton); container.add(deleteButton); container.add(renameButton); container.add(nodeName_TextField); } public static void main(String[] args) { MyJFrame frame =new MyJFrame(); frame.setVisible(true); } //检验用户是否选择了结点或进行了输入 private boolean checkNode_or_checkInput(DefaultMutableTreeNode node,String name) { //判断用户是否选择了一个结点 if(node == null) { System.out.println("请选择一个结点"); return false; } //判断用户是否进行了输入 if("".equals(name)) { System.out.println("请填写结点名称"); return false; } return true; } }
上一篇:
多线程四大经典案例
下一篇:
MySql:where 子查询