一、图形界面绘制
整体界面架构
// 创建 JFrame 实例
JFrame frame = new JFrame("Login Example");
// 窗口大小
frame.setSize(1000, 800);
// 窗口居中
mainFrame.setLocationRelativeTo(null);
// 窗口退出方式
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* 创建面板,这个类似于 HTML 的 div 标签
* 我们可以创建多个面板并在 JFrame 中指定位置
* 面板中我们可以添加文本字段,按钮及其他组件。
*/
JPanel panel = new JPanel();
// 添加面板
frame.add(panel);
/*
* 调用用户定义的方法并添加组件到面板
*/
placeComponents(panel);
// 设置界面可见(什么时候调用这句话?好像是最后的时候)
frame.setVisible(true);
private static void placeComponents(JPanel panel) {
/* 布局部分我们这边不多做介绍
* 这边设置布局为 null
*/
panel.setLayout(null);
// 创建 JLabel
JLabel userLabel = new JLabel("User:");
/* 这个方法定义了组件的位置。
* setBounds(x, y, width, height)
* x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
*/
userLabel.setBounds(10,20,80,25);
panel.add(userLabel);
显示弹窗
JPanel contentPane;
JOptionPane.showMessageDialog(contentPane, "用户名为空");
窗口居中
JFramemainFrame = new JFrame();
mainFrame.setSize(1000, 800);
mainFrame.setLocationRelativeTo(null);
表格问题
总结三点:
1、用JScrollPane承接Table,不用JPanel等;
2、用JScrollPane的构造函数构建,或者用scrollPanel.setViewportView(table);
不用scrollPanel.add(table);
3、承接Table的父容器的布局管理器不能设置为null,其实,对于JScrollPane的布局,有专门的
scroll的布局,也可以用,简便的话,不设置布局;不要Null;
frame = new JFrame("Calendar");
JPanel showDaysPanel = new JPanel();
frame.add(showDaysPanel, BorderLayout.CENTER);
// 这种写法虽然有种操蛋的感觉
//(因为setShowDaysPanel这个方法本来就是为showDaysPanel定制的,别人也用不了,你传参干什么。。。。)
// 但是这么写也凑乎吧,就是很诡异。
this.setShowDaysPanel(showDaysPanel);
private void setShowDaysPanel(JPanel panel) {
panel.setLayout(new BorderLayout());
daysTable = new JTable(5, 7);
JScrollPane scrollPanel = new JScrollPane();
scrollPanel.setViewportView(daysTable);
panel.add(scrollPanel);
DefaultTableModel daysTableModel = (DefaultTableModel)daysTable.getModel();
daysTableModel.setColumnIdentifiers(new Object[] {"日", "一", "二", "三", "四", "五", "六"});
daysTable.setModel(daysTableModel);
}
修改表格内数据
// 获得表格模型
DefaultTableModel model = (DefaultTableModel)daysTable.getModel();
// 清空表格中数据,直接把整个表格的UI都删没了,只剩下一个表头
model.setRowCount(0);
Object[] dataRow = new Object[7];
for(int i=0; i<daysArray.length/7; i++) {
for(int j=0; j<7; j++) {
dataRow[j] = daysArray[i*7 + j];
}
model.addRow(dataRow);
}
daysTable.setModel(model);
二、数据交互
获取输入框的数据
界面构建:
// 用户名输入框
JTextField textFieldUser = new JTextField();
textFieldUser.setBounds(125, 50, 100, 15);
contentPane.add(textFieldUser);
textFieldUser.setColumns(10); // 什么意思
// 密码输入框
JPasswordField textFieldPwd = new JPasswordField();
textFieldPwd.setBounds(125, 100, 100, 15);
contentPane.add(textFieldPwd);
textFieldPwd.setColumns(10); // 什么意思
内容获取
String userName = textFieldUser.getText();
String pwd = new String(textFieldPwd.getPassword());
DBService db = new DBService(userName, pwd);
注意:密码的获取方式 String pwd = new String(textFieldPwd.getPassword());
输入框设置初始值
textFieldUser.setText("root");
textFieldPwd.setText("123456");
三、事件绑定
事件绑定所用java语法
// 第一种
insertButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
insertButtonHandle(e);
}
});
// 第二种
insertButton.addActionListener(e -> this.insertButtonHandle(e));
// 第三种
insertButton.addActionListener(this::insertButtonHandle);
按键事件处理
JButton buttonLogin = new JButton("登录");
buttonLogin.setBounds(100, 180, 90, 20);
contentPane.add(buttonLogin);
buttonLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
}
});
窗口使能事件处理
frame = new JFrame("Calendar");
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
thisWindowActionvateHandle(e);
}
});
private void thisWindowActionvateHandle(WindowEvent e) {
this.yearField.setText("2019");
this.monthField.setText("11");
showDays();
}