共兩大題 窗體實現(略去測試類即 實例化自定義窗體)
小結:
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); } }
結果