说起大一就学过C++,但从未接触过VC++,至于做界面也是直到学java才开始,所以自己还是个新手啊。。。
步入正题,通过自己写的两个小程序,对做界面的思路进行一下整理。
首先,构想出自己想要实现的界面是什么样子。可以在纸上画出个轮廓(我是这么干的。。。),尽量详尽,比如点击按钮后的实现一个页面的跳转,跳转之后的页面也画出来。为什么要这样呢?都知道界面是由控件和容器组成的,画的目的就是清楚要用哪些组件,并且根据自己的界面,然后组织容器,再进而组织布局。对于布局可能会比较麻烦一点,这要根据你的窗口是固定不变的大小,还是大小可变的。如果窗口是固定大小,那就好弄点,因为不用考虑窗口大小的改变对组件位置的影响。如果是窗口大小可变的话,就尽量避免使用null布局,null布局我称其为绝对布局(web
css里面有绝对布局,当然跟那个不大一样,反正就这么叫了。。。),null布局位置不会改变,采用null布局内的控件大小不会改变,所以窗口可变的话,就很难看了。。。不过根据实际情况,有些地方也是可以用的。布局有很多种,一般都是嵌套使用。每种布局都有自己的优缺点,网格布局可将面板分成n*m的小方格,每个格子中的控件大小一样,并且随着窗口的改变,控件大小跟着变,但相对位置保持不变;流式布局,根据对齐方式不同,可将组件挨个排序,该行排满换行,窗口大小改变后,控件位置就像流水一样顺着动。其他方式还没去具体实践,就不说了。
然后,构想完界面,声明完控件,然后就开始编界面吧。对于界面,首先是一个Frame框架,对于Frame,可以设置它的标题setTitle();(标题也可以创建的时候在构造函数中确定标题。),然后是窗口大小,这个可能对新手而言很头疼,到底要设置多大呢?其实也很简单,在java核心卷一中讲到一个函数,可以得到该pc窗口的实际大小,根据这个值来调整就行。(代码附下面了。。)然后设置是否可见,关闭属性等。。到这里框架已经建好,下面开始添加容器。
//得到pc窗口大小 Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height;
frame = new JFrame("Java小课堂"); frame.setBounds(screenWidth / 3, screenHeight / 4, 450, 300); // 设置位置及大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setBackground(Color.lightGray); frame.getContentPane().setLayout(null); // 使用绝对布局 frame.setResizable(false); // 设置窗口大小不可变
对于容器也没什么难理解的,如果把框架比作画板,那么容器就相当于画纸,纸是在板表面的,所以有层次之分,重点是你要时刻知道是哪张纸位于最上边。这里的纸就是 JPanel ,跟Frame差不多了,设置大小,设置布局,设置背景颜色,设置位置。其实创建任何一个组件也都是一个套路,位置,大小,内容,颜色等。如果前边做的比较好,那么对于布局,就是一个劲的添东西就行了。
下面附上两个程序的代码
import java.awt.Color; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.SwingConstants; public class 第九题 { public static void main(String[] args) { // TODO Auto-generated method stub MyWindow win = new MyWindow(); } } class MyWindow extends Frame implements ActionListener { String s , str[] = new String[7]; File f = new File("E:\\", "English.txt"); FileReader inOne; BufferedReader inTwo; JButton btn_ans, btn_next, btn_new; JCheckBox checkbox[]; JTextField test, result; JLabel Label, Label2; ButtonGroup sele = new ButtonGroup(); int score = 0; JFrame frame; MyWindow() { frame = new JFrame("英语测试"); // frame.setBackground(Color.MAGENTA); // frame.getContentPane().setBackground(Color.LIGHT_GRAY); frame.setBounds(100, 100, 450, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(null); btn_next = new JButton("下一题"); btn_next.setBounds(38, 197, 93, 23); frame.getContentPane().add(btn_next); btn_next.addActionListener(this); btn_ans = new JButton("结果"); btn_ans.setBounds(166, 197, 93, 23); frame.getContentPane().add(btn_ans); btn_ans.addActionListener(this); btn_new = new JButton("重做一遍"); btn_new.setBounds(294, 197, 93, 23); frame.getContentPane().add(btn_new); btn_new.addActionListener(this); result = new JTextField(); result.setBounds(351, 22, 66, 21); frame.getContentPane().add(result); result.setColumns(10); result.setEditable(false); result.setFocusable(false); Label = new JLabel("分数:"); Label.setHorizontalAlignment(SwingConstants.CENTER); Label.setBounds(290, 24, 54, 15); frame.getContentPane().add(Label); Label2 = new JLabel("题干:"); Label2.setBounds(10, 22, 54, 15); frame.getContentPane().add(Label2); test = new JTextField(); test.setBounds(0, 47, 434, 29); frame.getContentPane().add(test); test.setColumns(40); test.setEditable(false); test.setFocusable(false); checkbox = new JCheckBox[4]; for (int i = 0; i <= 3; i++) { checkbox[i] = new JCheckBox("New check box"); sele.add(checkbox[i]); } checkbox[0].setBounds(61, 100, 103, 23); checkbox[1].setBounds(61, 151, 103, 23); checkbox[2].setBounds(224, 100, 103, 23); checkbox[3].setBounds(224, 151, 103, 23); for (int i = 0; i <= 3; i++) { frame.getContentPane().add(checkbox[i]); } frame.setVisible(true); try { inOne = new FileReader(f); inTwo = new BufferedReader(inOne); } catch (IOException e) { } getText(); } public void getText() { try { s = inTwo.readLine(); if (!s.contains("endend")) { // String regex = "#"; str = s.split("#"); // for(int i = 0; i < str.length; i++){ // // } // char[] ch = new char[s.length()]; // s.getChars(0, s.length(), ch, 0); // int cnt = 0, pos = 0; // for (int i = 0; i < s.length(); i++) { // // if (ch[i] == '#') { // str[cnt++] = s.substring(pos, i); // pos = i + 1; // } // } // str[cnt++] = s.substring(pos, s.length()); test.setText(str[0]); for (int j = 1; j <= 4; j++) { checkbox[j - 1].setText(str[j]); } } else { test.setText("学习完毕"); for (int j = 0; j < 4; j++) { checkbox[j].setText("end"); inTwo.close(); inOne.close(); } } } catch (IOException e) { test.setText("文件不存在"); } } public void actionPerformed(ActionEvent event) { if (event.getSource() == btn_new) { score = 0; result.setText(s.valueOf(score)); try { inOne = new FileReader(f); inTwo = new BufferedReader(inOne); } catch (IOException e) { } for (int j = 0; j < 4; j++) { checkbox[j].setEnabled(true); } btn_ans.setEnabled(true); getText(); } if (event.getSource() == btn_next) { // 读下一题 getText(); for (int j = 0; j < 4; j++) { checkbox[j].setEnabled(true); } btn_ans.setEnabled(true); } if (event.getSource() == btn_ans) { for (int j = 0; j < 4; j++) { if (checkbox[j].getText().equals(str[5]) && checkbox[j].isSelected()) { score++; result.setText(s.valueOf(score)); } checkbox[j].setEnabled(false); } btn_ans.setEnabled(false); } } }
第二个
public class Login { public static void main(String[] args){ new MainWindow(); } }
import java.awt.*; import java.awt.event.*; import javax.swing.*; @SuppressWarnings("serial") public class MainWindow extends JFrame { // ********************************************* // 第一步声明程序所需控件 // ********************************************* JFrame frame; // 上边面板的控件 JButton btn_add, btn_query_stu, btn_query_cnt; JPanel panel_head, panel_add, panel_query_stu, panel_query_cnt; // 下面第二个面板的控件 JLabel label_query_name; JTextField text_in; JTextArea text_result; JButton btn_Ok; // 下面第一个面板的控件 JButton btn_submit; JLabel label_name, label_number, label_mark; JTextField text_name, text_number, text_mark, text_sta; // 下面第三个面板的控件 JLabel label; JTextArea text_cnt; public MainWindow() { // ******************************** // 第二步设置 底层窗口属性 // ******************************** // 得到当前屏幕的尺寸 Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; // frame指底层窗口 frame = new JFrame("Java小课堂"); frame.setBounds(screenWidth / 3, screenHeight / 4, 450, 300); // 设置位置及大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setBackground(Color.lightGray); frame.getContentPane().setLayout(null); // 使用绝对布局 frame.setResizable(false); // 设置窗口大小不可变 // 上层面板 panel_head = new JPanel(); panel_head.setBounds(2, 0, 440, 40); panel_head.setBackground(Color.lightGray); panel_head.setVisible(true); panel_head.setLayout(new GridLayout(1, 3, 2, 0)); btn_add = new JButton("新增"); btn_add.setFont(new Font("宋体", 1, 12)); // 设置字体 格式 大小 btn_add.setVisible(true); panel_head.add(btn_add); btn_add.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { panel_add.setVisible(true); panel_query_stu.setVisible(false); panel_query_cnt.setVisible(false); } }); btn_query_stu = new JButton("查询学生"); btn_query_stu.setVisible(true); panel_head.add(btn_query_stu); btn_query_stu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { panel_add.setVisible(false); panel_query_stu.setVisible(true); panel_query_cnt.setVisible(false); } }); btn_query_cnt = new JButton("及格人数"); btn_query_cnt.setVisible(true); panel_head.add(btn_query_cnt); btn_query_cnt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { panel_add.setVisible(false); panel_query_stu.setVisible(false); panel_query_cnt.setVisible(true); text_cnt.setText(operator.query_num()); } }); frame.getContentPane().add(panel_head); // 下层面板 Font font = new Font("宋体", 1, 16); panel_add = new JPanel(); panel_add.setBounds(2, 45, 440, 225); panel_add.setBackground(Color.lightGray); panel_add.setLayout(new GridLayout(4, 2, 20, 20)); label_number = new JLabel("学号:"); label_number.setFont(font); label_number.setHorizontalAlignment(SwingConstants.CENTER); panel_add.add(label_number); text_number = new JTextField(); text_number.setFont(font); panel_add.add(text_number); label_name = new JLabel("姓名:"); label_name.setFont(font); label_name.setHorizontalAlignment(SwingConstants.CENTER); panel_add.add(label_name); text_name = new JTextField(); text_name.setFont(font); panel_add.add(text_name); label_mark = new JLabel("成绩:"); label_mark.setFont(font); label_mark.setHorizontalAlignment(SwingConstants.CENTER); panel_add.add(label_mark); text_mark = new JTextField(); text_mark.setFont(font); panel_add.add(text_mark); btn_submit = new JButton("提交"); btn_submit.setFont(font); btn_submit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String s = text_mark.getText(); String sta = operator.adds(text_number.getText(), text_name.getText(), Double.parseDouble(s)); if ("添加成功".equals(sta)) { text_number.setText(null); text_name.setText(null); text_mark.setText(null); } text_sta.setText(sta); } }); panel_add.add(btn_submit); text_sta = new JTextField(); panel_add.add(text_sta); panel_add.setVisible(true); frame.getContentPane().add(panel_add); // 下层面板 panel_query_stu = new JPanel(); panel_query_stu.setBounds(2, 45, 440, 225); panel_query_stu.setBackground(Color.lightGray); panel_query_stu.setLayout(null); label_query_name = new JLabel("输入要查询的学生姓名:"); label_query_name.setBounds(10, 10, 150, 40); panel_query_stu.add(label_query_name); text_in = new JTextField(); text_in.setBounds(160, 10, 100, 40); panel_query_stu.add(text_in); text_result = new JTextArea(); text_result.setBounds(10, 60, 420, 140); text_result.setFont(font); text_result.setEditable(false); panel_query_stu.add(text_result); btn_Ok = new JButton("查询"); btn_Ok.setFont(font); btn_Ok.setBounds(300, 10, 100, 40); btn_Ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { text_result.setText(operator.query_stu(text_in.getText())); } }); panel_query_stu.add(btn_Ok); panel_query_stu.setVisible(false); frame.getContentPane().add(panel_query_stu); // // 下层面板 panel_query_cnt = new JPanel(); panel_query_cnt.setBounds(2, 45, 440, 225); panel_query_cnt.setBackground(Color.lightGray); panel_query_cnt.setLayout(null); label = new JLabel("及格人数为:"); label.setBounds(10, 10, 150, 40); label.setFont(font); panel_query_cnt.add(label); text_cnt = new JTextArea(); text_cnt.setFont(new Font("宋体",1,30)); text_cnt.setBounds(10, 60, 420, 140); panel_query_cnt.add(text_cnt); frame.getContentPane().add(panel_query_cnt); panel_query_cnt.setVisible(false); // 需添加完组件后设置可见 frame.setVisible(true); // 设置窗口可见 } }
public class operator { public static String adds(String number, String name, double mark) { sql_operator ops = new sql_operator(); String datasorce = "javalecture"; String tableName = "javareport"; ops.setDatasourceName(datasorce); ops.setTableName(tableName); ops.setNumber(number); ops.setName(name); ops.setMark(mark); return ops.addRecord(); } public static String query_stu(String name) { sql_operator ops = new sql_operator(); String datasorce = "javalecture"; String tableName = "javareport"; ops.setDatasourceName(datasorce); ops.setTableName(tableName); ops.setName(name); return ops.query_stu(); } public static String query_num() { sql_operator ops = new sql_operator(); String datasorce = "javalecture"; String tableName = "javareport"; ops.setDatasourceName(datasorce); ops.setTableName(tableName); return ops.query_cnt(); } }
import java.util.*; import java.sql.*; public class sql_operator { String datasourceName = ""; String tableName = ""; String number = "", name = ""; double mark; ArrayList<StringBuffer> queryResult; public sql_operator() { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println(e); } } public void setDatasourceName(String s) { datasourceName = s.trim(); } public void setTableName(String s) { tableName = s.trim(); } public void setNumber(String s) { number = s.trim(); } public void setName(String s) { name = s.trim(); } public void setMark(double m) { mark = m; } public String query_stu() { String queryResult = ""; Connection con; PreparedStatement sql; ResultSet rs; try { String uri = "jdbc:mysql://localhost:3306/" + datasourceName + "?characterEncoding=utf8&useSSL=true"; String id = "root"; String password = ""; con = DriverManager.getConnection(uri, id, password); String insertCondition = "SELECT * FROM " + tableName + " WHERE name=?"; sql = con.prepareStatement(insertCondition); sql.setString(1, name); rs = sql.executeQuery(); while (rs.next()) { queryResult = rs.getString(1) + " "+rs.getString(2)+" " + rs.getString(3); } con.close(); } catch (SQLException e) { return e.toString(); } return queryResult; } public String query_cnt() { int cnt = 0; Connection con; PreparedStatement sql; ResultSet rs; try { String uri = "jdbc:mysql://localhost:3306/" + datasourceName + "?characterEncoding=utf8&useSSL=true"; String id = "root"; String password = ""; con = DriverManager.getConnection(uri, id, password); String insertCondition = "SELECT COUNT(DISTINCT number) FROM " + tableName + " WHERE mark>=60"; sql = con.prepareStatement(insertCondition); rs = sql.executeQuery(); // java.sql.SQLException: Before start of result set // 解决方法:使用rs.getString();前一定要加上rs.next(); // 原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。 // 每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next() // 应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。 // 在ResultSe对象及其t父辈Statement对象关闭之前,光标一直保持有效。 while (rs.next()) { cnt = rs.getInt(1); } con.close(); } catch (SQLException e) { return e.toString(); } return String.valueOf(cnt); } public String addRecord() { Connection con; PreparedStatement sql; try { String uri = "jdbc:mysql://localhost:3306/" + datasourceName + "?characterEncoding=utf8&useSSL=true"; String id = "root"; String password = ""; con = DriverManager.getConnection(uri, id, password); String insertCondition = "INSERT INTO " + tableName + " VALUES (?,?,?)"; sql = con.prepareStatement(insertCondition); if (9 == number.length()&&mark>=0&&mark<=100) { sql.setString(1, number); sql.setString(2, name); sql.setDouble(3, mark); int m = sql.executeUpdate(); if (m != 0) { con.close(); return "添加成功"; } else { con.close(); return "添加失败"; } }else{ con.close(); if(9 == number.length()) return "成绩不合法,插入失败"; else return "学号不合法,插入失败"; } } catch (SQLException e) { return e.toString(); } } }
第二个程序的界面