Java做界面思路整理
Posted efine_dxq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java做界面思路整理相关的知识,希望对你有一定的参考价值。
说起大一就学过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();
}
}
}
第二个程序的界面
以上是关于Java做界面思路整理的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BottomNavigationView 的片段上打开搜索界面?