/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package db;import java.util.HashMap;
import java.util.LinkedList;
import java.util.Set;/**** @author lol*/publicclassDBMapextendsHashMap<String, LinkedList<Object> > {public DBMap() {super();}publicstaticint getLength(DBMap m) {return m.values().iterator().next().size();}publicstatic LinkedList > toHigh(DBMap m) {LinkedList > list = new LinkedList();Set set = m.keySet();for(String str : set) {list.add(m.get(str));}return list;}publicstatic LinkedList > toRow(DBMap m) {LinkedList > list = new LinkedList();LinkedList > hList = toHigh(m);LinkedList
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/package boss;/**** @author lol*/publicclassBoss {String name;String map;int x;int y;String time;String time2;String time3;public String getName() {return name;}publicvoidsetName(String name) {this.name = name;}public String getMap() {return map;}publicvoidsetMap(String map) {this.map = map;}publicintgetX() {return x;}publicvoidsetX(int x) {this.x = x;}publicintgetY() {return y;}publicvoidsetY(int y) {this.y = y;}public String getTime() {return time;}publicvoidsetTime(String time) {this.time = time;}public String getTime2() {return time2;}publicvoidsetTime2(String time2) {this.time2 = time2;}public String getTime3() {return time3;}publicvoidsetTime3(String time3) {this.time3 = time3;}publicBoss(String name, String map, int x, int y, String time) {this.name = name;this.map = map;this.x = x;this.y = y;this.time = time;}}
BossControl .java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package boss;import db.DBMan;
import db.DBMap;
import java.io.IOException;
import java.sql.SQLException;
import java.util.LinkedList;public class BossControl {public static void add(Boss e) throws SQLException, IOException, ClassNotFoundException {String sql = "insert into shentu(name, map, time, time2, time3, x, y) value(?,?,?,?,?,?,?)";DBMan db = DBMan.getInstance();db.update(sql, e.getName(), e.getMap(), e.getTime(), e.getTime2(), e.getTime3(), e.getX(), e.getY());}public static void update(Boss e) throws SQLException, IOException, ClassNotFoundException {String sql = "UPDATE shentu SET map = ?, time = ?, time2 = ?, time3 = ?, x = ?, y = ? WHERE name = ?";DBMan db = DBMan.getInstance();db.update(sql, e.getMap(), e.getTime(), e.getTime2(), e.getTime3(), e.getX(), e.getY(), e.getName());}public static void delete(String name) throws IOException, SQLException, ClassNotFoundException {String sql = "delete from shentu where name=?";DBMan db = DBMan.getInstance();db.update(sql, name);}}
GUI制作
直接使用NetBeans的可视化编程即可。
MainFrame.java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package main;import boss.Boss;
import boss.BossControl;
import db.DBMan;
import db.DBMap;
import gui.TextJDialog;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Date;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableModel;/**** @author lol*/
public class MainFrame extends javax.swing.JFrame {JFrame f;/*** Creates new form MainFrame*/public MainFrame() {f = this;initComponents();init();}/*** This method is called from within the constructor to initialize the form.* WARNING: Do NOT modify this code. The content of this method is always* regenerated by the Form Editor.*/@SuppressWarnings("unchecked")// "collapsed" desc="Generated Code"> private void initComponents() {jScrollPane1 = new javax.swing.JScrollPane();jTable1 = new javax.swing.JTable();jLabel1 = new javax.swing.JLabel();jLabel2 = new javax.swing.JLabel();jLabel3 = new javax.swing.JLabel();jLabel4 = new javax.swing.JLabel();timeText = new javax.swing.JTextField();nameText = new javax.swing.JTextField();yText = new javax.swing.JSpinner();xText = new javax.swing.JSpinner();jButton1 = new javax.swing.JButton();mapText = new javax.swing.JTextField();time2Text = new javax.swing.JTextField();jLabel5 = new javax.swing.JLabel();jLabel6 = new javax.swing.JLabel();time3Text = new javax.swing.JSpinner();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());jTable1.setModel(new javax.swing.table.DefaultTableModel(new Object [][] {{null, null, null, null},{null, null, null, null},{null, null, null, null},{null, null, null, null}},new String [] {"Title 1", "Title 2", "Title 3", "Title 4"}));jScrollPane1.setViewportView(jTable1);getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 260, 340, 350));jLabel1.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel1.setText("怪兽名字");getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, -1, 32));jLabel2.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel2.setText("地图名字");getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 49, -1, 32));jLabel3.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel3.setText("位置坐标");getContentPane().add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 88, -1, 32));jLabel4.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel4.setText("刷新时间(30分)");getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 170, -1, 32));timeText.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NtimeText.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {timeTextActionPerformed(evt);}});getContentPane().add(timeText, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 130, 210, 32));nameText.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NnameText.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {nameTextActionPerformed(evt);}});getContentPane().add(nameText, new org.netbeans.lib.awtextra.AbsoluteConstraints(91, 11, 260, 32));getContentPane().add(yText, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 90, 110, 32));getContentPane().add(xText, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 90, 110, 32));jButton1.setText("确认");jButton1.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {jButton1ActionPerformed(evt);}});getContentPane().add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(250, 210, 100, 40));mapText.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NmapText.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {mapTextActionPerformed(evt);}});getContentPane().add(mapText, new org.netbeans.lib.awtextra.AbsoluteConstraints(91, 50, 260, 32));time2Text.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18Ntime2Text.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent evt) {time2TextActionPerformed(evt);}});getContentPane().add(time2Text, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 170, 210, 30));jLabel5.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel5.setText("刷新时间");getContentPane().add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 210, 80, 40));jLabel6.setFont(new java.awt.Font("宋体", 0, 18)); // NOI18NjLabel6.setText("死亡时间(30分)");getContentPane().add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 130, 130, 32));time3Text.setValue(30);getContentPane().add(time3Text, new org.netbeans.lib.awtextra.AbsoluteConstraints(90, 210, 150, 40));pack();}// private void timeTextActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:} private void nameTextActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:} private Boss getBoss() {String name = nameText.getText();String map = mapText.getText();int x = Integer.parseInt(xText.getValue().toString());int y = Integer.parseInt(yText.getValue().toString());String time = String.valueOf(timeText.getText());return new Boss(name, map, x, y, time);}// 显示点击的客户信息public void showItem(int row) {TableModel m = jTable1.getModel();nameText.setText(m.getValueAt(row, 1).toString());mapText.setText(m.getValueAt(row, 4).toString());xText.setValue(Integer.parseInt(m.getValueAt(row, 2).toString()));yText.setValue(Integer.parseInt(m.getValueAt(row, 3).toString()));}private void save() {Boss boss = getBoss();long time = new Date().getTime();time += Long.parseLong(time3Text.getValue().toString()) * 60 * 1000;Date d = new Date(time);boss.setTime2(String.valueOf(d.getHours()) + ":" + String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds()));boss.setTime3(time3Text.getValue().toString());try {BossControl.add(boss);} catch (SQLException | IOException | ClassNotFoundException ex) {try {System.out.println("已经存在,进行修改" + ex.getMessage());BossControl.update(boss);} catch (SQLException | IOException | ClassNotFoundException ex1) {System.out.println("数据库出错---" + ex1.getMessage() + "\n");}}init();JOptionPane.showMessageDialog(this, "操作成功!", "提示", JOptionPane.INFORMATION_MESSAGE);}private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { save();} private void mapTextActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:} private void time2TextActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here:} public void init() {String sql = "select name, map, time2, x, y from shentu";this.setResizable(false);DBMap m;try {m = DBMan.getInstance().query(sql);showTable(m, title);} catch (IOException | ClassNotFoundException | SQLException ex) {System.out.println("数据库出错---" + ex.getMessage() + "\n");}Thread t = new Thread() {@Overridepublic void run() {while (true) {Date d = new Date();timeText.setText(String.valueOf(d.getHours()) + ":" + String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds()));long time = new Date().getTime();time += Long.parseLong(time3Text.getValue().toString()) * 60 * 1000;d = new Date(time);time2Text.setText(String.valueOf(d.getHours()) + ":" + String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds()));try {Thread.sleep(1000);} catch (InterruptedException ex) {}}}};t.start();}// 显示数据public void showTable(Map> map, String... title) {// 将数据生成二维数组Setset = map.keySet();Object[] a = map.values().toArray();int size = ((LinkedList) a[0]).size();Object[][] cc = new Object[size][a.length];for (int i = 0; i < a.length; i++) {LinkedList l = (LinkedList) a[i];for (int j = 0; j < size; j++) {cc[j][i] = l.get(j);}}// 将二维数组导入并设置标头Object[] ar = set.toArray();if (title.length == set.size()) {ar = title;}// 实例化,并点击事件jTable1 = new JTable(cc, ar) {@Overridepublic boolean isCellEditable(int row, int column) {if (lastCol == column && lastRow == row) {TextJDialog t = new TextJDialog(f, true, "确认删除请输入Y");if (t.getText(0).equalsIgnoreCase("Y")) {try {BossControl.delete(jTable1.getModel().getValueAt(row, 1).toString());init();JOptionPane.showMessageDialog(null, "删除成功", "提示", JOptionPane.INFORMATION_MESSAGE);} catch (Exception ex) {JOptionPane.showMessageDialog(f, ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);}}} else {showItem(row);}lastRow = row;lastCol = column;return false;}};// 将单元格内容居中显示DefaultTableCellRenderer render = new DefaultTableCellRenderer();render.setHorizontalAlignment(SwingConstants.CENTER);for (int i = 0; i < ar.length; i++) {jTable1.getColumn(ar[i]).setCellRenderer(render);}jScrollPane1.setViewportView(jTable1);this.revalidate();}private int lastRow;private int lastCol;String[] title = {"刷新时间", "怪兽名字", "X坐标", "Y坐标", "地图名称"};// Variables declaration - do not modify private javax.swing.JButton jButton1;private javax.swing.JLabel jLabel1;private javax.swing.JLabel jLabel2;private javax.swing.JLabel jLabel3;private javax.swing.JLabel jLabel4;private javax.swing.JLabel jLabel5;private javax.swing.JLabel jLabel6;private javax.swing.JScrollPane jScrollPane1;private javax.swing.JTable jTable1;private javax.swing.JTextField mapText;private javax.swing.JTextField nameText;private javax.swing.JTextField time2Text;private javax.swing.JSpinner time3Text;private javax.swing.JTextField timeText;private javax.swing.JSpinner xText;private javax.swing.JSpinner yText;// End of variables declaration
}
工具类
这个是之前写好的,可以自定义进行弹框输入并返回。
TextJDialog .java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/package gui;import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextField;/**** @author lol*/publicclassTextJDialogextendsJDialog {private JTextField[] text;privateint size;private TextJDialog jd;publicTextJDialog(Frame owner, boolean modal, String... str) {super(owner, modal);this.setTitle("请输入以下内容");if (str.length == 0) {return;}TextListener lis = new TextListener();jd = this;size = str.length;text = new JTextField[size];this.setLayout(null);int i;int maxLength = -1;for (i = 0; i < size; i++) {JLabel la = new JLabel(str[i]);int l = str[i].length();if (l > maxLength) {maxLength = l;}la.setBounds(10, 5 + 30 * i, 15 * l, 25);text[i] = new JTextField();text[i].setBounds(20 + 15 * l, 5 + 30 * i, 150, 25);text[i].addActionListener(lis);this.add(la);this.add(text[i]);}JButton b = new JButton("确认");b.addActionListener(lis);b.setBounds(170 + maxLength * 15, 5 + 30 * (i - 1), 60, 25);this.addKeyListener(lis);this.add(b);this.setBounds(owner.getX() + owner.getWidth() / 2 - 150, owner.getY() + owner.getHeight() / 2 - (size + 1) * 20, 275 + maxLength * 15, (size + 1) * 40);this.setVisible(true);}public String getText(int id) {if (id >= 0 && id < size) {return text[id].getText();} else {returnnull;}}public String[] getTexts() {String[] str = new String[size];for (int i = 0; i < size; i++) {str[i] = text[i].getText();}return str;}class TextListener extends KeyAdapter implements ActionListener {@OverridepublicvoidactionPerformed(ActionEvent e) {jd.setVisible(false);}@OverridepublicvoidkeyPressed(KeyEvent e) {if (e.getKeyChar() == KeyEvent.VK_ENTER) {jd.setVisible(false);}}}
}
主函数
Main.java
/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/package main;/**** @author lol*/publicclassMain {/*** @param args the command line arguments*/publicstaticvoidmain(String[] args) {// TODO code application logic hereMainFrame m = new MainFrame();m.setTitle("神途BOSS计时器------by.凌恋");m.setVisible(true);m.setAlwaysOnTop(true); // 置顶}}