1、实现一个计算器。
原文链接:https://blog.csdn.net/weixin_44829930/article/details/111780377
//原文链接:https://blog.csdn.net/weixin_44829930/article/details/111780377
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class Counter extends JPanel {
public Graphics g = null;
public static void main(String[] args) {
Counter counter = new Counter();
counter.run();
}
public void run() {
CouterListener couterListener = new CouterListener();
// 窗体标题
JFrame frame = new JFrame("Calculate");
// 布局:上下左右的间距为10
FlowLayout fl = new FlowLayout(FlowLayout.CENTER, 10, 10);
frame.setLayout(fl);
// 界面的的尺寸
frame.setSize(270, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(3);
// 固定窗体的大小,无法通过鼠标改变大小
frame.setResizable(false);
// 多行文本框
JTextArea field = new JTextArea();
// 文本框的尺寸
field.setPreferredSize(new Dimension(250, 50));
// 设置最外层Frame的行数为2,一行放文本框,一行放按钮
field.setRows(3);
frame.add(field);
// 背景颜色(可根据自己要求进行修改)
frame.setBackground(Color.GRAY);
couterListener.setJText(field);
// 按钮布局,可以根据需要进行修改
String BtArray[] = { "1", "2", "3", "+",
"4", "5", "6", "-",
"7", "8", "9", "*",
".", "0", "=", "/" };
// 按钮一共4行4列
this.setLayout(new GridLayout(4, 4, 10, 10));
frame.add(this);
for (int i = 0; i < 16; i++) {
JButton button = new JButton(BtArray[i]);
// 按钮的颜色
button.setForeground(Color.DARK_GRAY);
button.setPreferredSize(new Dimension(50, 50));
button.setContentAreaFilled(false);
this.add(button);
// 给按钮绑定点击事件
button.addActionListener(couterListener);
}
//添加CE按钮
JButton ce = new JButton("CE");
ce.setForeground(Color.DARK_GRAY);
ce.setPreferredSize(new Dimension(250, 50));
ce.setContentAreaFilled(false);
ce.addActionListener(couterListener);
frame.add(ce);
// 使窗口显示
frame.setVisible(true);
g = frame.getGraphics();
}
}
class CouterListener implements ActionListener {
// 文本域对象
private JTextArea JF;
public int x = 0;
//记录最新输入的是否为数字
public boolean isNumber = true;
// 结果
public Double resulte = 0.0, temp = 0.0;
public String num[] = new String[3];
// 用于保存等号之前一次的运算符,比如 + - * /
public String count;
// 设置文本域
public void setJText(JTextArea F) {
JF = F;
}
@Override
public void actionPerformed(ActionEvent e) {
// 运算符事件:+ - * / 运算符
ArrayList calculateCommands = new ArrayList<String>();
calculateCommands.add("+");
calculateCommands.add("-");
calculateCommands.add("*");
calculateCommands.add("/");
// 获得当前的命令
String command = e.getActionCommand();
if ("CE".equals(command)) {
// 归零
resulte = temp = 0.0;
count = "";
JF.setText("");
isNumber = true;
}else if (calculateCommands.contains(command)) {
// + - * /
JF.setText(JF.getText() + command + "\n");
if (isNumber) {
//输入运算符时,result保存运算符之前的数
resulte = temp;
}
// 保存本次的运算符
count = e.getActionCommand();
isNumber = false;
} else if ("=".equals(command)) {
// 计算结果
if ("+".equals(count)) {
resulte = resulte + temp;
JF.setText(resulte + "");
} else if ("-".equals(count)) {
resulte = resulte - temp;
JF.setText(resulte + "");
} else if ("*".equals(count)) {
resulte = resulte * temp;
JF.setText(resulte + "");
} else if ("/".equals(count)) {
resulte = resulte / temp;
JF.setText(resulte + "");
}
} else {
//输入的不是 ce + - * / = 的时候,即输入的是数字的时候
JF.setText(JF.getText() + command);
if (!isNumber) {
//如果上一次输入的是字符
//正则表达式:根据换行符[\n]将文本框内字符串变成字符串数组
num = JF.getText().split("\\n");
//将运算符后面的(即换行符后面的)数字保存到temp中去
temp = Double.parseDouble(num[1]);
// 将下面注释打开就可以知道num和temp的作用了
System.out.println("num: ");
for (int i = 0; i < num.length; i++) {
System.out.printf("[" + i + "]:\"" +num[i] + "\"\n");
}
System.out.println("temp: " + temp);
} else {
//如果是第一次输入数字
temp = Double.parseDouble(JF.getText());
}
}
}
}
2、实现一个记事本程序。
原文链接:https://blog.csdn.net/qq_48273925/article/details/120633517
对原文代码作了部分修改
//原文链接:https://blog.csdn.net/qq_48273925/article/details/120633517
//对原文代码作了部分修改
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
//以上都是一些需要用到的库类
public class Menu {
public static void main(String[] args) {
SwingUtilities.invokeLater(Menu::creatGUI);
}
public static void creatGUI() {
//创建可视化窗口
JFrame f = new JFrame("记事本程序");
//设定显示位置,左上角为(0,0),根据笔记本电脑的显示分辨率设置成在正中间显示
f.setLocation(480, 270);//这是显示窗口的左上角坐标
//设定窗口大小为屏幕1/2倍(电脑显示分辨率)
f.setSize(960, 540);//我电脑显示分辨率为1920*1080
//创建文本域用来打字显示出来的
JTextArea WBY = new JTextArea("Hello");//这里可以输入东西到时候打开窗体自动显示出来
WBY.setFont(new Font("", Font.BOLD, 25));
//设置文本域为自动换行
WBY.setLineWrap(true);
//将文本域添加到含有下拉框的面板中
JScrollPane MB = new JScrollPane(WBY);
//将含有下拉框的面板放入内容面板中
f.add(MB);
//创建一个菜单栏
JMenuBar cdl = new JMenuBar();
//创建菜单栏上的5个菜单并且设置字体和大小
JMenu m1 = new JMenu("文件");
JMenu m2 = new JMenu("编辑");
JMenu m3 = new JMenu("字体大小");
JMenu m4 = new JMenu("字体颜色");
JMenu m5 = new JMenu("帮助文档");
m1.setFont(new Font("", Font.BOLD, 25));
m2.setFont(new Font("", Font.BOLD, 25));
m3.setFont(new Font("", Font.BOLD, 25));
m4.setFont(new Font("", Font.BOLD, 25));
m5.setFont(new Font("", Font.BOLD, 25));
//在菜单的基础上创建下拉可选菜单项按钮
JMenuItem x1 = new JMenuItem("新建");
JMenuItem x2 = new JMenuItem("保存");
JMenuItem x3 = new JMenuItem("打开");
JMenuItem x4 = new JMenuItem("退出");
JMenuItem x5 = new JMenuItem("复制");
JMenuItem x6 = new JMenuItem("粘贴");
JMenuItem x7 = new JMenuItem("裁剪");
JMenuItem x8 = new JMenuItem("删除");
JMenuItem x9 = new JMenuItem("大");
JMenuItem x10 = new JMenuItem("中");
JMenuItem x11 = new JMenuItem("小");
JMenuItem x12 = new JMenuItem("红色");
JMenuItem x13 = new JMenuItem("绿色");
JMenuItem x14 = new JMenuItem("蓝色");
JMenuItem x15 = new JMenuItem("黑色");
JMenuItem x16 = new JMenuItem("百度");
//为下拉可选菜单项设置字体和大小
x1.setFont(new Font("s", Font.BOLD, 20));
x2.setFont(new Font("s", Font.BOLD, 20));
x3.setFont(new Font("s", Font.BOLD, 20));
x4.setFont(new Font("s", Font.BOLD, 20));
x5.setFont(new Font("s", Font.BOLD, 20));
x6.setFont(new Font("s", Font.BOLD, 20));
x7.setFont(new Font("s", Font.BOLD, 20));
x8.setFont(new Font("s", Font.BOLD, 20));
x9.setFont(new Font("s", Font.BOLD, 40));
x10.setFont(new Font("s", Font.BOLD, 30));
x11.setFont(new Font("s", Font.BOLD, 20));
x12.setFont(new Font("s", Font.BOLD, 20));
x13.setFont(new Font("s", Font.BOLD, 20));
x14.setFont(new Font("s", Font.BOLD, 20));
x15.setFont(new Font("s", Font.BOLD, 20));
x16.setFont(new Font("s", Font.BOLD, 20));
//给颜色下拉菜单项分别设置相应的背景色,这样展现就会直观一点了
x12.setBackground(Color.RED);
x13.setBackground(Color.GREEN);
x14.setBackground(Color.BLUE);
x15.setBackground(Color.BLACK);
//实现新建记事本按钮的功能
x1.addActionListener(e -> {
creatGUI();
});//再次调用该方法创建另外一个记事本
//实现保存记事本按钮的功能
x2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e2) {
//创建一个窗体并且设置窗体标题和保存功能
FileDialog fileDialog = new FileDialog(f, "保存文件至", FileDialog.SAVE);
//保存文件的对话框设置为可见
fileDialog.setVisible(true);
//获取保存的路径和设置的文件名
String absPath = fileDialog.getDirectory() + fileDialog.getFile();
try {//用来检测是否设置了保存路径
//设置输出文件名为保存的路径下面的文件名
BufferedWriter wr = new BufferedWriter(new FileWriter(absPath));
//获取文本域字符串
String s = WBY.getText();
//开始写入
wr.write(s);
//写完关闭
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
//实现打开记事本按钮的功能
x3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e2) {
//创建一个窗体并且设置窗体标题和打开功能
FileDialog fileDialog = new FileDialog(f, "打开文件", FileDialog.LOAD);
//打开文件的对话框设置为可见
fileDialog.setVisible(true);
//获取打开的路径和设置的文件名
String absPath = fileDialog.getDirectory() + fileDialog.getFile();
try {//用来检测是否设置了打开路径
//设置读入文件名为打开的路径下面的文件名
BufferedReader re = new BufferedReader(new FileReader(absPath));
String line;
while ((line = re.readLine()) != null)
//只要文件中不为空就不断追加到文本框中
WBY.append(line + '\n');
//读取完毕结束
re.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
//实现退出记事本按钮的功能
x4.addActionListener(e -> System.exit(0));
//调用文件工具箱下的系统剪贴板方法
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//实现复制文本按钮的功能
x5.addActionListener(e -> {
//将选中的文本内容存入text中
String text = WBY.getSelectedText();
//传送到字符串里面存着
StringSelection selection = new StringSelection(text);
//将得到的内容放入到剪切板中
clipboard.setContents(selection, null);
});
//实现粘贴文本按钮的功能
x6.addActionListener(e -> {
//获取系统剪贴板中的内容
Transferable text = clipboard.getContents(null);
//判断剪贴板中的内容是否支持文本
if (text.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
//强制转换剪贴板中的内容
String text1 = (String) text.getTransferData(DataFlavor.stringFlavor);
//获取当前光标的位置
int n=WBY.getCaretPosition();
//插入复制的内容到文本框的光标后面
WBY.insert(text1,n);
} catch (Exception e2) {
e2.printStackTrace();
}
}
});
//实现裁剪文本按钮的功能
x7.addActionListener(e -> {
//将得到的选择文本内容存入text中
String text = WBY.getSelectedText();
//传送到字符串里面存着
StringSelection selection = new StringSelection(text);
//将得到的内容放到剪切板中
clipboard.setContents(selection, null);
//将选中文本start到end之间的内容替换为空白""
WBY.replaceRange("", WBY.getSelectionStart(), WBY.getSelectionEnd());
});
//实现删除文本按钮的功能
x8.addActionListener(e -> {
//将选中文本start到end之间的内容替换为空白
WBY.replaceRange("", WBY.getSelectionStart(), WBY.getSelectionEnd());
});
//实现字体变大的功能
x9.addActionListener(e -> {
WBY.setFont(new Font("", Font.BOLD, 40));
});
//实现字体变中等大小的功能
x10.addActionListener(e -> {
WBY.setFont(new Font("", Font.BOLD, 30));
});
//实现字体变小的功能
x11.addActionListener(e -> {
WBY.setFont(new Font("", Font.BOLD, 20));
});
//实现字体颜色变红的功能
x12.addActionListener(e -> {
WBY.setForeground(Color.RED);
});
//实现字体颜色变绿的功能
x13.addActionListener(e -> {
WBY.setForeground(Color.GREEN);
});
//实现字体颜色变蓝的功能
x14.addActionListener(e -> {
WBY.setForeground(Color.BLUE);
});
//实现字体颜色变黑的功能
x15.addActionListener(e -> {
WBY.setForeground(Color.BLACK);
});
//实现打开帮助文档的功能
x16.addActionListener(e -> {
//创建消息提示框,包括显示内容和弹窗标题
JOptionPane.showMessageDialog(f,
"百度!", "提示", JOptionPane.INFORMATION_MESSAGE);
});
//分别给5个菜单添加各自的下拉菜单项
m1.add(x1);
m1.addSeparator();//两个菜单项之间添加界线
m1.add(x2);
m1.addSeparator();//两个菜单项之间添加界线
m1.add(x3);
m1.addSeparator();//两个菜单项之间添加界线
m1.add(x4);
m2.add(x5);
m2.addSeparator();//两个菜单项之间添加界线
m2.add(x6);
m2.addSeparator();//两个菜单项之间添加界线
m2.add(x7);
m2.addSeparator();//两个菜单项之间添加界线
m2.add(x8);
m3.add(x9);
m3.addSeparator();//两个菜单项之间添加界线
m3.add(x10);
m3.addSeparator();//两个菜单项之间添加界线
m3.add(x11);
m4.add(x12);
m4.addSeparator();//两个菜单项之间添加界线
m4.add(x13);
m4.addSeparator();//两个菜单项之间添加界线
m4.add(x14);
m4.addSeparator();//两个菜单项之间添加界线
m4.add(x15);
m5.add(x16);
//添加这5个菜单到菜单栏
cdl.add(m1);
cdl.add(m2);
cdl.add(m3);
cdl.add(m4);
cdl.add(m5);
//给窗体添加完善好的菜单栏
f.setJMenuBar(cdl);
//记事本设置为可见
f.setVisible(true);
//点击×号结束应用程序
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
3、创建一用户登录界面,接受用户输入的帐号和密码,给三次输入机会,要求连接数据库实现
原文链接:https://blog.csdn.net/qq_46144237/article/details/112648510
对原文代码作了部分修改
注:要连接本地的数据库,对应好数据表的字段名,我这里用的是name
和password
//原文链接:https://blog.csdn.net/qq_46144237/article/details/112648510
//对原文代码作了部分修改
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
class DbUtil {
static Connection conn = null;
static Statement sm = null;
static ResultSet rs = null;
static String driver = "com.mysql.cj.jdbc.Driver";
static String url = "jdbc:mysql://localhost:3306/testdatabase";
static String username = "root";
static String password = "mysql1234";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn =
DriverManager.getConnection(url, username, password);
sm = conn.createStatement();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static ResultSet getResult(String sql) {
try {
rs = sm.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
}
public class LoginDemo extends DbUtil {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGUI());
}
public static boolean checkByUnameAndPwd(String uname, String pwd) {
String sql = "select * from user where name='" + uname + "' and password='" + pwd + "' ";
ResultSet rs = getResult(sql);
boolean flag = false;
try {
while (rs.next()) {
flag = true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
public static void createAndShowGUI() {
final int[] count = {0};
JFrame f = new JFrame();
f.setTitle("登录");
f.setSize(210, 164);
f.setLocationRelativeTo(null);
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout layout = new FlowLayout();
layout.setVgap(12);
f.setLayout(layout);
JLabel lblUser = new JLabel("用户名:");
JLabel lblPass = new JLabel("密 码:");
JTextField txtUser = new JTextField(10);
JPasswordField pwdPass = new JPasswordField(10);
JPanel panel = new JPanel();
layout = new FlowLayout();
layout.setHgap(30);
panel.setLayout(layout);
JButton btnLogin = new JButton("登录");
JButton btnExit = new JButton("退出");
f.add(lblUser);
f.add(txtUser);
f.add(lblPass);
f.add(pwdPass);
panel.add(btnLogin);
panel.add(btnExit);
f.add(panel);
btnLogin.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (count[0] < 3) {
if (checkByUnameAndPwd(txtUser.getText(), new String(pwdPass.getPassword()))) {
JOptionPane.showMessageDialog(f, "欢迎登录");
} else {
JOptionPane.showMessageDialog(f, "用户名或密码错误!");
count[0]++;
}
} else {
JOptionPane.showMessageDialog(f, "您已经输错三次,请稍后再试!");
}
}
});
btnExit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(f, "欢迎下次再来!");
System.exit(0);
}
});
}
}