java 实验6 图形用户界面设计试验(2)
共两大题 窗体实现(略去测试类即 实例化自定义窗体)
小结:
1. JRadioButton 单选按钮
ButtonGroup 按钮集合(加入单选按钮)
清空选项需让ButtonGroup调用clearSelection()函数
bg.clearSelection();
2. JCheckBox 多选
清空选项需实例调用 jcb1.setSelected(false);
3. JComboBox 下拉列表
利用additem(str)增加选项
4. 实现树切换后的画布切换
JTabbedPane(选项卡) 清空所有组建removeAll();再增加组建
1、完成如下登陆界面, 其中用户名为abc。密码为1234,登陆成功登陆后弹出消息框,“欢迎您,abc 登陆”;如果密码输入错误,弹出对话框,显示“用户名和密码错误”,并清空输入的信息。
Login窗体类
package login; import javax.swing.JFrame; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Login extends JFrame implements ActionListener{ private static String USERNAME="abc"; private static String PASSWORD="1234"; JButton jb1,jb2; JTextField text1,text2; JDialog jd; Login() { setTitle("the login window"); JLabel label1=new JLabel("username "); JLabel label2=new JLabel("password "); text1=new JTextField(10); text2=new JTextField(10); jb1=new JButton("confirm"); jb2=new JButton("cancel"); jb1.addActionListener(this); setLayout(new GridLayout(3,1)); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel(); jp1.add(label1); jp1.add(text1); jp2.add(label2); jp2.add(text2); jp3.add(jb1); jp3.add(jb2); add(jp1); add(jp2); add(jp3); setBounds(100,100,300,150); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1); if(text1.getText().equals(USERNAME)&&text2.getText().equals(PASSWORD)) { JOptionPane.showMessageDialog(this, "输入正确"); new Info(); setVisible(false); } else{ JOptionPane.showMessageDialog(this, "用户名和密码错误"); text1.setText(null); text2.setText(null); } } }
结果
2、接第一题,如果登录成功,显示下面的界面:
(1)输入username,sex,department,hobby,telephoneNo, resume,点击“confirm”按钮,左边的信息显示在右边的区域,如下图所示:
(2)点击“Cancel”,弹出对话框请用户确认,如果用户选择“确定”,就清空左边和右边的信息。
(3)点击“Save”,在控制台显示:你的学号+你的姓名+“信息已保存”。
(4) 菜单“File”下显示 “New” 和 “Open”,指定“New”的快捷方式是Ctrl+N,点击“New”,将下面各输入部分清空(Sex项与Department项置为默认);点击“Open”,在控制台显示:你的学号+你的姓名+“点击了Open菜单项”。
(5)菜单“Edit”下显示“Cut”和“Copy”,点击“Cut”,在控制台显示:你的学号+你的姓名+“点击了Cut菜单项”; 点击“Copy”,在控制台显示:你的学号+你的姓名+“点击了Copy菜单项”。
info消息窗体类(大窗体实现)
package login; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import javax.swing.*; public class Info extends JFrame{ Info(){ //一些基本组建 JLabel label1 = new JLabel("Please input your information",Label.LEFT); JLabel label2 = new JLabel("username"); JLabel label3 = new JLabel("sex"); JLabel label4 = new JLabel("department"); JLabel label5 = new JLabel("hobby"); JLabel label6 = new JLabel("telephoneNo"); JLabel label7 = new JLabel("resume"); JLabel label8 = new JLabel("your information"); JTextField text1=new JTextField(20); JTextField text2=new JTextField(20); JTextArea text3=new JTextArea(20,20); JTextArea text4=new JTextArea(100,100); JPanel jp1=new JPanel(); JPanel jp2=new JPanel(); JPanel jp3=new JPanel(); JPanel jp4=new JPanel(); JPanel jp5=new JPanel(); JPanel jp6=new JPanel(); JPanel jp7=new JPanel(); JPanel left=new JPanel(); JPanel right=new JPanel(); JButton jb1=new JButton("Confirm"); JButton jb2=new JButton("Cancel"); JButton jb3=new JButton("Save"); //department下拉列表 JComboBox<String> box=new JComboBox<>(); box.addItem("Computer"); box.addItem("Math"); box.addItem("Energy"); box.addItem("Law"); //sex单选 JRadioButton sex1= new JRadioButton("male"); JRadioButton sex2= new JRadioButton("female"); ButtonGroup bg=new ButtonGroup(); bg.add(sex1); bg.add(sex2); //hobby多选 JCheckBox jcb1=new JCheckBox("music"); JCheckBox jcb2=new JCheckBox("reading"); JCheckBox jcb3=new JCheckBox("cooking"); //设置菜单 JMenuBar menubar=new JMenuBar(); JMenu menu1=new JMenu("File"); JMenu menu2=new JMenu("Edit"); JMenuItem item1=new JMenuItem("New"); JMenuItem item2=new JMenuItem("Open"); JMenuItem item3=new JMenuItem("Cut"); JMenuItem item4=new JMenuItem("Copy"); item1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK)); menu1.add(item1); menu1.addSeparator(); menu1.add(item2); menu2.add(item3); menu2.addSeparator(); menu2.add(item4); menubar.add(menu1); menubar.add(menu2); setJMenuBar(menubar); item1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { text1.setText(null); text2.setText(null); text3.setText(null); text4.setText(null); //想重置JRadioButton必让ButtonGroup调用clearSelection()函数 bg.clearSelection(); jcb1.setSelected(false); jcb2.setSelected(false); jcb3.setSelected(false); } }); item2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("20171335+cf+“点击了Open菜单项”"); } }); item3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("20171335+cf+“点击了Cut菜单项”"); } }); item4.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("20171335+cf+“点击了Copy菜单项”"); } }); //设置左半组件 jp1.add(sex1); jp1.add(sex2); jp2.add(jcb1); jp2.add(jcb2); jp2.add(jcb3); Box basebox,box1,box2; box1=Box.createVerticalBox(); box2=Box.createVerticalBox(); basebox=Box.createHorizontalBox(); box1.add(label2); box1.add(Box.createVerticalStrut(22)); box1.add(label3); box1.add(Box.createVerticalStrut(22)); box1.add(label4); box1.add(Box.createVerticalStrut(22)); box1.add(label5); box1.add(Box.createVerticalStrut(22)); box1.add(label6); box1.add(Box.createVerticalStrut(180)); box1.add(label7); box2.add(text1); box2.add(Box.createVerticalStrut(10)); box2.add(jp1); box2.add(Box.createVerticalStrut(10)); box2.add(box); box2.add(Box.createVerticalStrut(10)); box2.add(jp2); box2.add(Box.createVerticalStrut(10)); box2.add(text2); box2.add(Box.createVerticalStrut(10)); box2.add(new JScrollPane(text3)); basebox.add(box1); basebox.add(Box.createHorizontalStrut(20)); basebox.add(box2); jp3.add(jb1); jp3.add(jb2); jp5.add(jb1); jp5.add(jb2); left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS)); left.add(label1); left.add(basebox); left.add(jp5); //设置右半组件 jp6.add(jb3); right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS)); right.add(label8); right.add(text4); right.add(jp6); //设置confirm键 jb1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String username = text1.getText(); String sex =""; if(sex1.isSelected()) sex=sex1.getText(); else sex=sex2.getText(); String department = box.getSelectedItem().toString(); String hobby=""; for(Component c:jp2.getComponents()) { if(c instanceof JCheckBox) { if(((JCheckBox)c).isSelected()) { hobby+=((JCheckBox)c).getText(); hobby+=","; } } } String telephonNo=text2.getText(); String resume=text3.getText(); String result="my name: "+username+"\nsex: "+sex+"\ndepartment: " +department+"\nhobby: "+hobby+"\ntelephonNo: "+telephonNo+"\nresume: "+resume; text4.setText(result); } }); //设置Cancel键 jb2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int clean = JOptionPane.showConfirmDialog(null, "Do you confirm to delete it?","Warning",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE); if(clean==JOptionPane.YES_OPTION) { text1.setText(null); text2.setText(null); text3.setText(null); text4.setText(null); //想重置JRadioButton必让ButtonGroup调用clearSelection()函数 bg.clearSelection(); jcb1.setSelected(false); jcb2.setSelected(false); jcb3.setSelected(false); } } }); //设置Save键 jb3.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Saveinfo.save(text4.getText()); System.out.println("保存成功"); } }); //整体画布 JSplitPane all=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,right); add(all,BorderLayout.CENTER); //设置整体 setTitle("info"); setBounds(100,100,800,500); setVisible(true); validate(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } }
储存信息类(Save键用)
package login; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.file.Path; public class Saveinfo { public static void save(String str){ File directory = new File("."); String path = null; try { path = directory.getCanonicalPath();//获取当前路径 path +="\\info.txt"; System.out.println(path); BufferedWriter b=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path))); b.write(str); b.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
结果
3、参照如下界面,利用JTree, JSplitPane, JTable, JTabbedPane完成。
(1) 选中“沪宁高速A段维修工程”,三个页面如下:
(2) 选中“沪宁高速B段维修工程”,出现相应的页面,仅以“专家设置”举例如下:
(3) 选中任意一个表格,选中一行,在控制台输出选中行的内容,如下图选中了“沪宁高速A段维修工程”中“竞标单位设置”中的一行:
在控制台输出了相应内容:
窗体类
package 工程项目招标设置; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTree; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; public class Project extends JFrame { Project(){ //A“指标设置”表格 JPanel jp1=new JPanel(); jp1.setLayout(new BorderLayout()); Object[] Names1 = {"指标编号", "指标名称", "是否入选", "指标分值"}; Object[][] a= { {10,"施工性质","入选",20}, {11,"以往施工项目","入选",20}, {12,"注册资金","入选",30}, {13,"企业总资产","不选",20}, {14,"公司管理水平","不选",10}, }; JTable tabel1=new JTable(a,Names1); tabel1.setShowGrid(true); tabel1.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel1.getColumnCount(); i++) System.out.print(tabel1.getModel().getValueAt(tabel1.getSelectedRow(), i)+" "); System.out.println(); }}); jp1.add(new JScrollPane(tabel1),BorderLayout.NORTH); //A"竞标单位设置"表格 JPanel jp2=new JPanel(); jp2.setLayout(new BorderLayout()); Object[] Names2 = {"公司编号", "公司名称", "法人代表", "成立时间","地址"}; Object[][] b= { {001,"华西沪东建筑公司","张三","2000-2-1","上海市浦东新区"}, {002,"瑞丰建筑公司","李四","1998-3-1","上海市浦东新区"} }; JTable tabel2=new JTable(b,Names2); tabel2.setShowGrid(true); jp2.add(new JScrollPane(tabel2),BorderLayout.NORTH); tabel2.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel2.getColumnCount(); i++) System.out.print(tabel2.getModel().getValueAt(tabel2.getSelectedRow(), i)+" "); System.out.println(); }}); //A“专家设置”表格 JPanel jp3=new JPanel(); jp3.setLayout(new BorderLayout()); Object[] Names3 = {"专家编号", "专家名称", "性别", "学历","单位"}; Object[][] c= { {001,"张小三","男","博士","上海建筑研究所"}, {002,"刘芳芳","女","博士","北京建筑研究所"} }; JTable tabel3=new JTable(c,Names3); tabel3.setShowGrid(true); jp3.add(new JScrollPane(tabel3),BorderLayout.NORTH); tabel3.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel3.getColumnCount(); i++) System.out.print(tabel3.getModel().getValueAt(tabel3.getSelectedRow(), i)+" "); System.out.println(); }}); //B“指标设置”表格 JPanel jp4=new JPanel(); jp4.setLayout(new BorderLayout()); Object[] Names4 = {"指标编号", "指标名称", "是否入选", "指标分值"}; Object[][] d= { {1,"施工性质","不选",30}, {2,"以往施工项目","入选",40}, {3,"注册资金","入选",60}, {4,"企业总资产","不选",10}, {5,"公司管理水平","不选",20}, }; JTable tabel4=new JTable(d,Names4); tabel4.setShowGrid(true); jp4.add(new JScrollPane(tabel4),BorderLayout.NORTH); tabel4.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel4.getColumnCount(); i++) System.out.print(tabel4.getModel().getValueAt(tabel4.getSelectedRow(), i)+" "); System.out.println(); }}); //B"竞标单位设置"表格 JPanel jp5=new JPanel(); jp5.setLayout(new BorderLayout()); Object[] Names5 = {"公司编号", "公司名称", "法人代表", "成立时间","地址"}; Object[][] e= { {001,"华东建筑公司","张三","2001-2-1","上海市浦东新区"}, {002,"瑞丰建筑公司","李四","2000-3-1","上海市浦东新区"} }; JTable tabel5=new JTable(e,Names5); tabel5.setShowGrid(true); jp5.add(new JScrollPane(tabel5),BorderLayout.NORTH); tabel5.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel5.getColumnCount(); i++) System.out.print(tabel5.getModel().getValueAt(tabel5.getSelectedRow(), i)+" "); System.out.println(); }}); //B“专家设置”表格 JPanel jp6=new JPanel(); jp6.setLayout(new BorderLayout()); Object[] Names6 = {"专家编号", "专家名称", "性别", "学历","单位"}; Object[][] f= { {001,"任芳","男","硕士","华北建筑研究所"}, {002,"刘齐齐","女","博士","华东建筑研究所"} }; JTable tabel6=new JTable(f,Names6); tabel6.setShowGrid(true); jp6.add(new JScrollPane(tabel6),BorderLayout.NORTH); tabel6.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e){ for (int i = 0; i < tabel6.getColumnCount(); i++) System.out.print(tabel6.getModel().getValueAt(tabel6.getSelectedRow(), i)+" "); System.out.println(); }}); //选项卡-收录表格 JTabbedPane p=new JTabbedPane(JTabbedPane.NORTH); //“招标项目名”树 DefaultMutableTreeNode root = new DefaultMutableTreeNode("招标项目名"); DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("沪宁高速A段维修工程"); DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("沪宁高速B段维修工程"); root.add(node1); root.add(node2); JTree tree=new JTree(root); tree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); if(node.equals(node1)) { p.removeAll(); p.add("指标设置",jp1); p.add("竞标单位设置",jp2); p.add("专家设置",jp3); } if(node.equals(node2)) { p.removeAll(); p.add("指标设置",jp4); p.add("竞标单位设置",jp5); p.add("专家设置",jp6); } } }); setTitle("工程项目招标设置"); JSplitPane jsp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,tree,p); jsp.setDividerLocation(170); add(jsp); setBounds(100,100,700,400); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
结果