欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java GUI實(shí)現(xiàn)ATM機(jī)系統(tǒng)(3.0版)

 更新時(shí)間:2022年05月27日 11:32:53   作者:點(diǎn)丶錯(cuò)了。。  
這篇文章主要為大家詳細(xì)介紹了java GUI實(shí)現(xiàn)ATM機(jī)系統(tǒng)(3.0版),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

寫個(gè)小項(xiàng)目了解一下GUI。用java GUI實(shí)現(xiàn)銀行ATM自動(dòng)取款機(jī),實(shí)現(xiàn)登錄界面、登錄成功界面、各個(gè)操作功能實(shí)現(xiàn)界面。

用java GUI實(shí)現(xiàn)一個(gè)ATM機(jī)系統(tǒng)(3.0版)

設(shè)計(jì)思路

設(shè)計(jì)兩個(gè)包(bank包,atmJFrame包)

1、bank包:

(1)、ATM類:實(shí)現(xiàn)用戶各種操作;
(2)、Data類:從user文件中獲取所有用戶信息,并返回要找的用戶,再將修改完之后的用戶信息寫入user文件中;
(3)、user文件儲(chǔ)存所有用戶信息。

2、atmJFrame包:

(1)、MyJFrame類:自己創(chuàng)建的界面父類;
(2)、LoginJFrame:登錄界面;
(3)、WorkingJFrame:登錄成功后顯示的功能界面;
(4)、CentreJFrame:中間窗口,存錢、取錢、轉(zhuǎn)賬、修改密碼界面的父類;
(5)、QuMoneyJFrame:取錢界面;
(6)、CunMoneyJFrame:存錢界面;
(7)、GiveMoneyJFrame:轉(zhuǎn)賬界面;
(8)、ChangePasswordJFrame:修改密碼界面。

源碼

bank包

package bank;

//ATM類
public class ATM {
 //有一個(gè)類操作數(shù)據(jù)的類
 private Data data = new Data();
 //ATM機(jī)里的數(shù)據(jù)
 private String userName;//用戶賬號(hào)且唯一
 private String userPassword;//用戶密碼
 private double userMoney;//用戶賬戶里的錢
 private String user;//使用該臺(tái)ATM機(jī)的用戶全部信息
 private String antherUser;//被轉(zhuǎn)賬用戶

 //登錄方法
 public boolean login(String userNameString,String userPassword1){
 boolean b= false;
 String x = data.backUser(userNameString);
 //判斷賬戶是否存在
 if(!x.equals("null")){
  user = x;//獲取用戶所有信息
  String[] str = user.split("\\*");//將用戶信息分割
  userName = str[0];//用戶名
  userPassword = str[1];//用戶密碼
  userMoney = Double.parseDouble(str[2]);//用戶余額
  //密碼正確
  if(userPassword.equals(userPassword1))
  b = true;
 }
 return b;
 }
 //獲取賬戶余額
 public Double getMoney1(){
 return userMoney;
 }
 //存錢
 public boolean saveMoney(Double money1){
 boolean b = false;
 if(money1%100 == 0) { //如果存的錢正確
  userMoney = userMoney + money1;//存上
  b = true;
 }
 return b;
 }
 //取錢
 public boolean quMoney(Double money1){
 boolean b = false;
 if(money1%100 == 0 && money1 <= userMoney){
  userMoney = userMoney - money1;
  b = true;
 }
 return b;
 }
 //只判斷用戶賬戶是否存在
 public boolean anotherUser(String userName1){
 boolean b = false;
 String inUserName = userName1;
 String str = data.backUser(inUserName);
 //如果該賬戶存在
 if(!str.equals("null")) {
  antherUser = str;//獲取被轉(zhuǎn)賬賬戶所有信息
  b = true;
 }
 return b;
 }
 //進(jìn)行轉(zhuǎn)賬
 public void giveMoney(Double money1){
 String[] str1 = antherUser.split("\\*");//分割
 Double x = Double.parseDouble(str1[2]);//獲取被轉(zhuǎn)賬賬戶余額
 x = x + money1;
 userMoney = userMoney - money1;
 antherUser = changeUser(str1[0], str1[1], x);//改變被轉(zhuǎn)賬賬戶信息
 data.saveData(antherUser,false);//將用戶信息傳給Data類保存被轉(zhuǎn)賬賬戶信息
 }
 //修改密碼實(shí)現(xiàn)
 public void changePassword(String newPassword){
 userPassword = newPassword;
 }
 //辦完業(yè)務(wù)后修改用戶信息
 private String changeUser(String n,String w,Double d){
 String str = n + "*" + w + "*" + d;
 return str;
 }
 //辦完所有業(yè)務(wù)
 public void over(){
 user = changeUser(userName,userPassword,userMoney);
 data.saveData(user,true);
 }
}
package bank;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

//數(shù)據(jù)類是文件和ATM機(jī)之間操作用戶信息的橋梁
public class Data {
 //Map儲(chǔ)存數(shù)據(jù)庫(kù)里所有用戶的全部信息
 Map<String,String> userData = new HashMap();
 //返回用戶的信息
 private String user;

 //創(chuàng)建數(shù)據(jù)類加載所有用戶信息
 public Data(){
 getUsers();
 }

 private void getUsers(){
 String str;
 String[] string;
 File file = new File("src\\bank\\user");
 FileReader fileReader = null;
 BufferedReader bufferedReader = null;
 try{
  fileReader = new FileReader(file);
  bufferedReader = new BufferedReader(fileReader);
  while((str = bufferedReader.readLine())!=null){
  string = str.split("\\*",2);
  userData.put(string[0],string[1]);
  }
 }catch(Exception e){
  e.printStackTrace();
  if((fileReader!=null)&&(bufferedReader!=null)){
  try {
   bufferedReader.close();
   fileReader.close();
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  }
 }
 }

 //告訴用戶名,如果找到返回該用戶所有信息,沒(méi)找到返回null
 public String backUser(String userName){
 String str = "null";
 if(userData.containsKey(userName))
  str = userName + "*" + userData.get(userName);
 user = str;
 return user;
 }
 //修改用戶數(shù)據(jù)并儲(chǔ)存在userData圖里
 public void saveData(String user,boolean aBoolean){
 String[] string = user.split("\\*",2);
 userData.remove(string[0]);
 userData.put(string[0],string[1]);
 if(aBoolean)//判斷用戶是否操作結(jié)束
  changeUser();
 }

 //用戶操作完,將userData里所有的用戶再寫入文件里
 private void changeUser(){
 String str,string="";
 Set<String> keys = userData.keySet();
 for(String key : keys){
  str = key + "*" + userData.get(key);
  string = string + str + "\n";
 }
 File file = new File("src\\bank\\user");
 FileWriter out = null;
 try {
  out = new FileWriter(file);
  out.write(string);
  out.flush();
 } catch (IOException e) {
  e.printStackTrace();
 }finally{
  if(out != null){
  try {
   out.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }
 }
}
//user文件
//需要注意文件位置"src\\bank\\user"
李四*234*7500.0
張三*123*13100.0
王五*123*1100.0

atmJFrame包

package atmJFrame.myJFrame;

import bank.ATM;

import javax.swing.*;
import java.awt.*;

//自己創(chuàng)造的界面的父類
public class MyJFrame extends JFrame {
 //設(shè)置字體供子類使用
 public static final Font FONT_SIZE_10 = new Font("宋體",Font.PLAIN,18);
 public static final Font FONT_SIZE_20 = new Font("宋體",Font.PLAIN,20);
 public static final Font FONT_SIZE_25 = new Font("宋體",Font.PLAIN,25);
 //給一個(gè)靜態(tài)公共不可改變的ATM對(duì)象作為屬性,供子類使用
 public static final ATM atm = new ATM();
 //創(chuàng)建窗體
 public MyJFrame(String title){
 super(title);
 //設(shè)置窗體不可改變
 setResizable(false);
 //設(shè)置窗體大小
 setSize(600,600);
 //設(shè)置窗體居中
 setLocationRelativeTo(null);
 }
 //無(wú)參構(gòu)造,創(chuàng)建無(wú)標(biāo)題窗體
 public MyJFrame(){
 this("");
 }
 //設(shè)置彈窗方法供子類使用(傳入字符串并顯示出)
 protected void showMessageDialog(String str){
 JOptionPane.showMessageDialog(this,str);
 }
}
package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//登錄界面繼承MyJFrame
public class LoginJFrame extends MyJFrame {
 public LoginJFrame(){
 super("歡迎使用ATM機(jī)");
 //設(shè)置窗體可關(guān)閉
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 //設(shè)置組件
 init();
 //界面可視化
 setVisible(true);
 }
 //初始化界面
 private void init(){
 //創(chuàng)建面板對(duì)象,并定義為空布局
 JPanel jp = new JPanel(null);
 //添加標(biāo)簽
 JLabel jl1 = new JLabel("賬號(hào):");
 JLabel jl2 = new JLabel("密碼:");
 //設(shè)置標(biāo)簽字體
 jl1.setFont(FONT_SIZE_20);
 jl2.setFont(FONT_SIZE_20);
 //設(shè)置標(biāo)簽在面板中的位置
 jl1.setBounds(100,100,70,70);
 jl2.setBounds(100,250,70,70);
 //添加文本框
 JTextField jtf = new JTextField(20);
 //添加密碼文本框
 JPasswordField jpf = new JPasswordField(20);
 //設(shè)置文本框位置
 jtf.setBounds(200,115,200,40);
 jpf.setBounds(200,265,200,40);
 //添加按鈕
 JButton jb = new JButton("登錄");
 //設(shè)置按鈕文字大小
 jb.setFont(FONT_SIZE_20);
 //設(shè)置按鈕位置及大小
 jb.setBounds(250,400,100,50);
 //設(shè)置面板背景顏色
 jp.setBackground(Color.YELLOW);
 //內(nèi)部類進(jìn)行事件處理
 jb.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
  //獲取輸入的賬號(hào)和密碼
  String userName = jtf.getText();
  String userPassword = new String(jpf.getPassword());
  //驗(yàn)證是否正確
  boolean aBoolean = atm.login(userName,userPassword);
  if(aBoolean){
   //登錄成功
   dispose();//關(guān)閉登錄界面
   //打開功能界面
   new WorkingJFrame();
  }
  else
   showMessageDialog("賬號(hào)或密碼錯(cuò)誤");//調(diào)用父類彈窗方法
  }
 });
 //添加組件
 jp.add(jl1);
 jp.add(jtf);
 jp.add(jl2);
 jp.add(jpf);
 jp.add(jb);
 //窗體添加面板
 add(jp);
 }
 public static void main(String[] args) {
 new LoginJFrame();//先創(chuàng)建登錄界面
 }
}
package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//功能界面
public class WorkingJFrame extends MyJFrame {
 public WorkingJFrame(){
 super("功能界面");
 init();
 setVisible(true);
 }
 //初始化功能界面
 private void init(){
 //設(shè)置第一個(gè)面板對(duì)象
 JPanel jp1 = new JPanel();
 //創(chuàng)建標(biāo)簽,將標(biāo)簽添加到第一個(gè)面板上
 JLabel jb = new JLabel("請(qǐng)選擇要進(jìn)行的操作:");
 jb.setFont(FONT_SIZE_25);//設(shè)置標(biāo)簽字體大小
 jp1.add(jb);
 jp1.setBackground(Color.CYAN);
 //將第一個(gè)面板添加到窗體上方(JFrame窗體是邊界布局)
 add(jp1, BorderLayout.NORTH);

 //創(chuàng)建第二個(gè)面板對(duì)象(空布局,自己設(shè)置按鈕位置及大?。?,然后將按鈕添加
 JPanel jp2 = new JPanel(null);
 //字符串?dāng)?shù)組存儲(chǔ)各個(gè)按鈕名字,然后循環(huán)設(shè)置按鈕名字
 String[] str = {"1、余額查詢","2、取錢","3、存錢","4、轉(zhuǎn)賬","5、修改密碼","6、退出系統(tǒng)"};
 //int二維數(shù)組儲(chǔ)存各個(gè)按鈕位置及大小信息,循環(huán)設(shè)置
 int[][] xy = new int[][]{{50,100,200,50},{350,100,200,50},{50,200,200,50},{350,200,200,50},{50,300,200,50},{350,300,200,50}};
 for(int i = 0;i < str.length;i ++){
  JButton jButton = new JButton(str[i]);//創(chuàng)建按鈕
  jButton.setFont(FONT_SIZE_20);//設(shè)置按鈕字體大小
  jButton.setBounds(xy[i][0],xy[i][1],xy[i][2],xy[i][3]);//設(shè)置按鈕位置及大小
  jButton.addActionListener(listener);//按鈕注冊(cè)監(jiān)聽器
  jp2.add(jButton);//將按鈕添加
 }
 //設(shè)置jp2背景顏色
 jp2.setBackground(Color.GRAY);
 //將第二個(gè)面板添加到窗體(JFrame窗體中間)
 add(jp2);
 }
 //創(chuàng)建事件監(jiān)聽器
 private ActionListener listener = new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {
  String actionCommand = e.getActionCommand();//獲取按鈕上的字
  //switch選擇功能,且每次功能結(jié)束回到該界面,關(guān)閉已操作完的功能界面
  switch(actionCommand){
  case "1、余額查詢":
   getMoney();
   break;
  case "2、取錢":
   quMoney();
   break;
  case "3、存錢":
   cunMoney();
   break;
  case "4、轉(zhuǎn)賬":
   giveMoney();
   break;
  case "5、修改密碼":
   changePassword();
   break;
  case "6、退出系統(tǒng)":
   over();
   break;
  }
 }
 };
 //查詢余額功能
 private void getMoney(){
 showMessageDialog("您的賬戶余額為:" + atm.getMoney1());//調(diào)用父類方法彈窗
 }
 //取錢功能
 private void quMoney(){
 new QuMoneyJFrame();//創(chuàng)建取錢界面
 dispose();//關(guān)閉該界面
 }
 //存錢功能
 private void cunMoney(){
 new CunMoneyJFrame();
 dispose();
 }
 //轉(zhuǎn)賬功能
 private void giveMoney(){
 new GiveMoneyJFrame();
 dispose();
 }
 //修改密碼功能
 private void changePassword(){
 new ChangePasswordJFrame();
 dispose();
 }
 //退出系統(tǒng)功能
 private void over(){
 atm.over();//調(diào)用方法操作文件
 dispose();
 }
}
package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//中間窗口,存錢、取錢、轉(zhuǎn)賬、修改密碼界面的父類
public class CentreJFrame extends MyJFrame {
 //空布局面板,自己設(shè)置組件位置及大小
 protected JPanel jp = new JPanel(null);
 //輸入金額標(biāo)簽
 protected JLabel jl = new JLabel("請(qǐng)輸入金額:");
 //輸入金額文件框
 protected JTextField jtf = new JTextField(20);
 //確認(rèn)、取消按鈕
 protected JButton jb1 = new JButton("確認(rèn)");
 protected JButton jb2 = new JButton("取消");

 //轉(zhuǎn)賬時(shí)轉(zhuǎn)賬賬號(hào)標(biāo)簽
 protected JLabel jLabel = new JLabel("請(qǐng)輸入轉(zhuǎn)賬賬號(hào):");
 //轉(zhuǎn)賬時(shí)轉(zhuǎn)賬賬號(hào)文本框
 protected JTextField jTextField = new JTextField(20);

 //修改密碼時(shí)新密碼標(biāo)簽
 protected JLabel jLabelCP = new JLabel("請(qǐng)輸入新密碼(只能為數(shù)字):");
 //修改密碼時(shí)新密碼文本框
 protected JTextField jTextFieldCP = new JTextField(20);

 //提醒用戶輸入金額為100的倍數(shù)
 private JLabel jle = new JLabel("( 提示:只能輸入100的倍數(shù) )");

 public CentreJFrame(String str){
 super(str);
 //判斷要進(jìn)行的操作
 if(str.equals("轉(zhuǎn)賬"))
  init1();
 else if(str.equals("修改密碼"))
  init2();
 else
  init();
 one();//最后調(diào)用共有
 }
 //取錢和取錢特有組件
 private void init(){
 //輸入金額標(biāo)簽,設(shè)置字體,位置及大小
 jl.setFont(FONT_SIZE_25);
 jl.setBounds(100,100,200,100);
 //輸入金額文本框
 jtf.setBounds(300,250,200,50);
 //添加輸入金額標(biāo)簽和輸入金額文本框
 jp.add(jl);
 jp.add(jtf);
 setJLE();
 }
 //轉(zhuǎn)賬特有組件
 private void init1(){
 init();
 //輸入賬戶標(biāo)簽
 jLabel.setFont(FONT_SIZE_25);
 jLabel.setBounds(100,10,200,40);
 //輸入賬戶文本
 jTextField.setBounds(300,80,200,50);
 //添加輸入賬戶標(biāo)簽和輸入賬戶文本
 jp.add(jLabel);
 jp.add(jTextField);
 }
 //修改密碼特有組件
 private void init2(){
 //輸入新密碼標(biāo)簽
 jLabelCP.setFont(FONT_SIZE_25);
 jLabelCP.setBounds(50,100,400,70);
 //輸入新密碼文本框
 jTextFieldCP.setBounds(300,215,200,40);
 //添加輸入新密碼標(biāo)簽和輸入新密碼文本框
 jp.add(jLabelCP);
 jp.add(jTextFieldCP);
 }
 //共有組件及操作
 private void one(){
 //按鈕設(shè)置
 jb1.setFont(FONT_SIZE_20);
 jb2.setFont(FONT_SIZE_20);
 jb1.setBounds(300,350,100,50);
 jb2.setBounds(450,350,100,50);
 jp.add(jb1);
 jp.add(jb2);
 jp.setBackground(Color.GREEN);
 jb1.addActionListener(listener);
 jb2.addActionListener(listener);
 //添加到窗體
 add(jp);
 setVisible(true);
 }

 //設(shè)置提示
 private void setJLE(){
 jle.setFont(FONT_SIZE_10);
 jle.setBounds(100,180,300,50);
 jp.add(jle);
 }

 //創(chuàng)建監(jiān)聽器
 private ActionListener listener = new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {//按鈕被點(diǎn)擊后
  String actionCommand = e.getActionCommand();//獲取按鈕上的字
  switch(actionCommand){
  case "確認(rèn)":
   change();
   break;
  case "取消":
   new WorkingJFrame();//創(chuàng)建功能界面
   dispose();//關(guān)閉此界面
   break;
  }
 }
 };
 //點(diǎn)擊確認(rèn)按鈕執(zhí)行的操作,子類重寫覆蓋實(shí)現(xiàn)各自功能
 protected void change(){
 }

 //正則表達(dá)式判斷輸入是否為數(shù)字
 protected boolean isNumber(String str){
 Pattern pattern = Pattern.compile("[0-9]*");
 Matcher isNum = pattern.matcher(str);
 if(!isNum.matches())
  return false;
 return true;
 }
}
package atmJFrame.myJFrame;

//取錢界面
public class QuMoneyJFrame extends CentreJFrame {
 public QuMoneyJFrame(){
 super("取錢");
 }
 protected void change(){
 String s = jtf.getText();
 if(isNumber(s)){
  Double money = Double.parseDouble(s);
  boolean b = atm.quMoney(money);
  if(b){
  showMessageDialog("請(qǐng)收好您的錢\n您的賬戶余額為:" + atm.getMoney1());
  }
  else
  showMessageDialog("您輸入有誤" );
 }
 else
  showMessageDialog("您輸入有誤" );
 jtf.setText("");
 }

}
package atmJFrame.myJFrame;

//存錢界面
public class CunMoneyJFrame extends CentreJFrame {
 public CunMoneyJFrame(){
 super("存錢");
 }
 protected void change(){
 String s = jtf.getText();
 if(isNumber(s)){
  Double money = Double.parseDouble(s);
  boolean b = atm.saveMoney(money);
  if(b)
  showMessageDialog("您的錢錢已存入\n您的賬戶余額為:" + atm.getMoney1());
  else
  showMessageDialog("您輸入有誤" );
 }
 else
  showMessageDialog("您輸入有誤" );
 jtf.setText("");
 }

}
package atmJFrame.myJFrame;

//轉(zhuǎn)賬界面
public class GiveMoneyJFrame extends CentreJFrame {
 public GiveMoneyJFrame(){
 super("轉(zhuǎn)賬");
 }
 protected void change(){
 String s = jTextField.getText();
 boolean b = atm.anotherUser(s);
 if(b){
  //獲取輸入金額
  String s1 = jtf.getText();
  if(isNumber(s1)){//如果輸入是數(shù)字
  Double money = Double.parseDouble(s1);
  atm.giveMoney(money);
  showMessageDialog("錢已轉(zhuǎn)入\n您的賬戶余額為:" + atm.getMoney1());
  }
  else
  showMessageDialog("您輸入有誤" );
 }
 else
  showMessageDialog("您輸入有誤" );
 new WorkingJFrame();//創(chuàng)建功能界面
 dispose();//關(guān)閉此界面
 }
}
package atmJFrame.myJFrame;

//修改密碼界面
public class ChangePasswordJFrame extends CentreJFrame{
 public ChangePasswordJFrame(){
 super("修改密碼");
 }

 protected void change(){
 String s = jTextFieldCP.getText();
 if(isNumber(s)){
  atm.changePassword(s);
  showMessageDialog("密碼修改成功");
 }
 else
  showMessageDialog("您輸入有誤" );
 new WorkingJFrame();//創(chuàng)建功能界面
 dispose();//關(guān)閉此界面
 }

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細(xì)介紹了Spring加載properties文件的兩種方法,一是通過(guò)xml方式,另一種方式是通過(guò)注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源

    SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源

    這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Spring security基于數(shù)據(jù)庫(kù)中賬戶密碼認(rèn)證

    Spring security基于數(shù)據(jù)庫(kù)中賬戶密碼認(rèn)證

    這篇文章主要介紹了Spring security基于數(shù)據(jù)庫(kù)中賬戶密碼認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java中的按位與(&)用法說(shuō)明

    java中的按位與(&)用法說(shuō)明

    這篇文章主要介紹了java中的按位與(&)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • java單例模式4種使用方式分享

    java單例模式4種使用方式分享

    到底如何寫一個(gè)在生產(chǎn)環(huán)境中使用的單實(shí)例模式?下面是4種方式,大家參考使用吧
    2014-02-02
  • SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù)流程詳解

    SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù)流程詳解

    ShedLock是一個(gè)鎖,官方解釋是他永遠(yuǎn)只是一個(gè)鎖,并非是一個(gè)分布式任務(wù)調(diào)度器。一般shedLock被使用的場(chǎng)景是,你有個(gè)任務(wù),你只希望他在單個(gè)節(jié)點(diǎn)執(zhí)行,而不希望他并行執(zhí)行,而且這個(gè)任務(wù)是支持重復(fù)執(zhí)行的
    2023-02-02
  • 解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set)

    解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set)

    這篇文章主要介紹了解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java?入門圖形用戶界面設(shè)計(jì)之事件處理下

    Java?入門圖形用戶界面設(shè)計(jì)之事件處理下

    圖形界面(簡(jiǎn)稱GUI)是指采用圖形方式顯示的計(jì)算機(jī)操作用戶界面。與早期計(jì)算機(jī)使用的命令行界面相比,圖形界面對(duì)于用戶來(lái)說(shuō)在視覺(jué)上更易于接受,本篇精講Java語(yǔ)言中關(guān)于圖形用戶界面的事件處理
    2022-02-02
  • Java日期工具類的封裝詳解

    Java日期工具類的封裝詳解

    在日常的開發(fā)中,我們難免會(huì)對(duì)日期格式化,對(duì)日期進(jìn)行計(jì)算,對(duì)日期進(jìn)行校驗(yàn),為了避免重復(fù)寫這些瑣碎的邏輯,我這里封裝了一個(gè)日期工具類,方便以后使用,直接復(fù)制代碼到項(xiàng)目中即可使用,需要的可以參考一下
    2022-10-10
  • 用命令行編譯java并生成可執(zhí)行的jar包方法

    用命令行編譯java并生成可執(zhí)行的jar包方法

    下面小編就為大家分享一篇用命令行編譯java并生成可執(zhí)行的jar包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論