how2j.cn

步骤 1 : 练习-增加   
步骤 2 : 答案-增加   
步骤 3 : 练习-删除   
步骤 4 : 答案-删除   
步骤 5 : 练习-编辑   
步骤 6 : 答案-编辑   
步骤 7 : 练习-修改   
步骤 8 : 答案-修改   
步骤 9 : 练习-使用按钮分页   
步骤 10 : 答案-使用按钮分页   
步骤 11 : 练习-使用下拉框分页   
步骤 12 : 答案-使用下拉框分页   

步骤 1 :

练习-增加

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
点击增加按钮,出现一个JDialog,在JDialog中进行增加
练习-增加
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

6分27秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


1. 首先把 htm和 table设计为静态,后面在更新表格数据的时候,就很容易访问这个两个对象
2. 设计一个静态内部类 AddDialog用于显示增加的界面
3. 在AddDialog中点击提交按钮后,进行为空和数字判断,然后通过dao提交到数据库
4. 隐藏这个AddDialog,并刷新table中的数据
package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { //把 htm和 table设计为静态,后面在更新表格数据的时候,就很容易访问这个两个对象 static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new BorderLayout()); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); pOperation.add(bAdd); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); } }); JScrollPane sp = new JScrollPane(t); f.add(sp, BorderLayout.CENTER); f.add(pOperation, BorderLayout.SOUTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class AddDialog extends JDialog{ JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName =new JTextField(); JTextField tfHp =new JTextField(); JButton bSubmit =new JButton("提交"); AddDialog(JFrame f){ super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput= new JPanel(); JPanel pSubmit= new JPanel(); pInput.setLayout(new GridLayout(2, 2,gap,gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50,20,200,100); pSubmit.setBounds(0,130,300,150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { if(checkEmpty(tfName, "名称")){ if(checkNumber(tfHp, "hp")){ String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); updateTable(); } } } }); } } public static void updateTable(){ htm.heros = new HeroDAO().list(); t.updateUI(); if(!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(null,msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(null,msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null,msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } }
步骤 3 :

练习-删除

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
提供一个删除按钮,点击删除按钮之后,删除选中的行,并且刷新table中的数据,然后再默认选中第一行。

如果点击删除的时候,没有任何行被选中,则提示“删除前应该选中一行”
练习-删除
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

5分13秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { //把 htm和 table设计为静态,后面在更新表格数据的时候,就很容易访问这个两个对象 static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new BorderLayout()); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); JButton bDelete = new JButton("删除"); pOperation.add(bAdd); pOperation.add(bDelete); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); } }); bDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //判断是否选中 int index = t.getSelectedRow(); if(-1==index){ JOptionPane.showMessageDialog(f, "删除前需要先选中一行"); return; } //进行确认是否要删除 if(JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(f, "确认要删除?")) return; //获取id Hero hero = htm.heros.get(index); int id =hero.id; //删除 new HeroDAO().delete(id); //更新table updateTable(); } }); JScrollPane sp = new JScrollPane(t); f.add(sp, BorderLayout.CENTER); f.add(pOperation, BorderLayout.SOUTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class AddDialog extends JDialog{ JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName =new JTextField(); JTextField tfHp =new JTextField(); JButton bSubmit =new JButton("提交"); AddDialog(JFrame f){ super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput= new JPanel(); JPanel pSubmit= new JPanel(); pInput.setLayout(new GridLayout(2, 2,gap,gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50,20,200,100); pSubmit.setBounds(0,130,300,150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { if(checkEmpty(tfName, "名称")){ if(checkNumber(tfHp, "hp")){ String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); updateTable(); } } } }); } } public static void updateTable(){ htm.heros = new HeroDAO().list(); t.updateUI(); if(!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(null,msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if(0==value.length()){ JOptionPane.showMessageDialog(null,msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null,msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } }
步骤 5 :

练习-编辑

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
提供一个编辑按钮,点击的时候,弹出一个JDialog,显示选中的数据,并且能够修改。

如果点击的时候,没有选中任意一行,则提示 "编辑前请选中一行数据"
练习-编辑
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费4个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分23秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { // 把 htm和 table设计为静态,后面在更新表格数据的时候,就很容易访问这个两个对象 static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new BorderLayout()); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); JButton bDelete = new JButton("删除"); JButton bEdit = new JButton("编辑"); pOperation.add(bAdd); pOperation.add(bDelete); pOperation.add(bEdit); bEdit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "编辑前需要先选中一行"); return; } // 获取选中的对象 Hero hero = htm.heros.get(index); // 显示编辑Dialog EditDialog ed = new EditDialog(f); ed.tfName.setText(hero.name); ed.tfHp.setText(String.valueOf((int) hero.hp)); ed.setVisible(true); } }); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); } }); bDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "删除前需要先选中一行"); return; } // 进行确认是否要删除 if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(f, "确认要删除?")) return; // 获取id Hero hero = htm.heros.get(index); int id = hero.id; // 删除 new HeroDAO().delete(id); // 更新table updateTable(); } }); JScrollPane sp = new JScrollPane(t); f.add(sp, BorderLayout.CENTER); f.add(pOperation, BorderLayout.SOUTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class AddDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); AddDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); updateTable(); } } } }); } } public static void updateTable() { htm.heros = new HeroDAO().list(); t.updateUI(); if (!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } static class EditDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); EditDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); } } }
步骤 7 :

练习-修改

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
接着练习-编辑继续完整修改的功能。 点击修改,首选判断数据是否正确,是否为空,是否为数字等。 通过校验后,把数据保存到数据库,然后刷新table中的数据,并且选中第一条。
练习-修改
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费3个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

4分5秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { // 把 htm和 table设计为静态,后面在更新表格数据的时候,就很容易访问这个两个对象 static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 300); f.setLocation(200, 200); f.setLayout(new BorderLayout()); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); JButton bDelete = new JButton("删除"); JButton bEdit = new JButton("编辑"); pOperation.add(bAdd); pOperation.add(bDelete); pOperation.add(bEdit); bEdit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "编辑前需要先选中一行"); return; } // 获取选中的对象 Hero hero = htm.heros.get(index); // 显示编辑Dialog EditDialog ed = new EditDialog(f); ed.tfName.setText(hero.name); ed.tfHp.setText(String.valueOf((int) hero.hp)); ed.setVisible(true); } }); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); } }); bDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "删除前需要先选中一行"); return; } // 进行确认是否要删除 if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(f, "确认要删除?")) return; // 获取id Hero hero = htm.heros.get(index); int id = hero.id; // 删除 new HeroDAO().delete(id); // 更新table updateTable(); } }); JScrollPane sp = new JScrollPane(t); f.add(sp, BorderLayout.CENTER); f.add(pOperation, BorderLayout.SOUTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class AddDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); AddDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); updateTable(); } } } }); } } public static void updateTable() { htm.heros = new HeroDAO().list(); t.updateUI(); if (!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } static class EditDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); EditDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { //获取id int index = t.getSelectedRow(); int id = htm.heros.get(index).id; String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; h.id= id; new HeroDAO().update(h); JOptionPane.showMessageDialog(f, "提交成功 "); EditDialog.this.setVisible(false); updateTable(); } } } }); } } }
步骤 9 :

练习-使用按钮分页

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
在table中仅仅显示10条数据。
在下方出现4个按钮
首页 上一页 下一页 末页

最后一页
最后一页需要注意,如果数据库中的总数能够整除10,那么最后一页就显示10个,否则就显示不到除以10的余数。 比如一共是25个,那么最后一页就显示5个。

按钮的状态要求:
如果有下一页的数据,才能点击下一页,否则下一页按钮是不可用的。
通过如下代码设置代码不可用

JButton.setEnable(false)

对首页,上一页和末页也是一样。
练习-使用按钮分页
步骤 10 :

答案-使用按钮分页

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

17分23秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); // 把分页按钮放在这里,后面监听器好访问 static JButton bFirst = new JButton("首页"); static JButton bPre = new JButton("上一页"); static JButton bNext = new JButton("下一页"); static JButton bLast = new JButton("末页"); static int number = 10;// 每页显示10个 static int start = 0;// 开始的页码 public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 340); f.setLocation(200, 200); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); JButton bDelete = new JButton("删除"); JButton bEdit = new JButton("编辑"); pOperation.add(bAdd); pOperation.add(bDelete); pOperation.add(bEdit); JPanel pPage = new JPanel(); pPage.add(bFirst); pPage.add(bPre); pPage.add(bNext); pPage.add(bLast); bEdit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "编辑前需要先选中一行"); return; } // 获取选中的对象 Hero hero = htm.heros.get(index); // 显示编辑Dialog EditDialog ed = new EditDialog(f); ed.tfName.setText(hero.name); ed.tfHp.setText(String.valueOf((int) hero.hp)); ed.setVisible(true); } }); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); updateButtonStatus(); } }); bDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "删除前需要先选中一行"); return; } // 进行确认是否要删除 if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(f, "确认要删除?")) return; // 获取id Hero hero = htm.heros.get(index); int id = hero.id; // 删除 new HeroDAO().delete(id); start = 0; // 更新table updateTable(); updateButtonStatus(); } }); addPageListener(); JScrollPane sp = new JScrollPane(t); f.setLayout(null); sp.setBounds(0, 0, 394, 200); pOperation.setBounds(0, 200, 394, 50); pPage.setBounds(0, 250, 394, 200); f.add(sp); f.add(pOperation); f.add(pPage); updateButtonStatus(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private static void addPageListener() { bFirst.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start = 0; updateTable(); updateButtonStatus(); } }); bPre.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start -= number; updateTable(); updateButtonStatus(); } }); bNext.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start += number; updateTable(); updateButtonStatus(); } }); bLast.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start = last(); updateTable(); updateButtonStatus(); } }); } private static void updateButtonStatus() { int last = last(); // 是否有上一页 if (0 != start) { bFirst.setEnabled(true); bPre.setEnabled(true); } // 是否是第一页 if (0 == start) { bFirst.setEnabled(false); bPre.setEnabled(false); } // 是否是最后一页 if (start == last) { bLast.setEnabled(false); bNext.setEnabled(false); } // 是否有下一页 if (start < last) { bLast.setEnabled(true); bNext.setEnabled(true); } } static class AddDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); AddDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); start = 0; updateTable(); } } } }); } } public static void updateTable() { htm.heros = new HeroDAO().list(start, number); t.updateUI(); if (!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } static class EditDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); EditDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { // 获取id int index = t.getSelectedRow(); int id = htm.heros.get(index).id; String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; h.id = id; new HeroDAO().update(h); JOptionPane.showMessageDialog(f, "提交成功 "); EditDialog.this.setVisible(false); updateTable(); } } } }); } } private static int last() { // 最后一页开始的位置 int last; int total = new HeroDAO().getTotal(); // 最后一页要看总是是否能够整除每页显示的数量number if (0 == total % number) { // 假设总数是20,那么最后一页开始的位置就是10 last = total - number; } else { // 假设总数是21,那么最后一页开始的位置就是20 last = total - total % number; } return last; } }
步骤 11 :

练习-使用下拉框分页

edit  姿势不对,事倍功半! 点击查看做练习的正确姿势
借助下拉框实现下拉框分页
练习-使用下拉框分页
步骤 12 :

答案-使用下拉框分页

edit
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
查看本答案会花费5个积分,您目前总共有点积分。查看相同答案不会花费额外积分。 积分增加办法 或者一次性购买JAVA 中级总计0个答案 (总共需要0积分)
账号未激活 账号未激活,功能受限。 请点击激活
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

18分14秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器


package gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import charactor.Hero; import jdbc.HeroDAO; public class TestGUI { static HeroTableModel htm = new HeroTableModel(); static JTable t = new JTable(htm); // 把分页按钮放在这里,后面监听器好访问 static JButton bFirst = new JButton("首页"); static JButton bPre = new JButton("上一页"); static JButton bNext = new JButton("下一页"); static JButton bLast = new JButton("末页"); static JComboBox<Integer> cb = new JComboBox<>(); static int number = 10;// 每页显示10个 static int start = 0;// 开始的页码 private static boolean cbListenerEnabled = true; public static void main(String[] args) { final JFrame f = new JFrame("LoL"); f.setSize(400, 340); f.setLocation(200, 200); t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); t.getSelectionModel().setSelectionInterval(0, 0); JPanel pOperation = new JPanel(); JButton bAdd = new JButton("增加"); JButton bDelete = new JButton("删除"); JButton bEdit = new JButton("编辑"); pOperation.add(bAdd); pOperation.add(bDelete); pOperation.add(bEdit); JPanel pPage = new JPanel(); pPage.add(bFirst); pPage.add(bPre); pPage.add(cb); pPage.add(bNext); pPage.add(bLast); bEdit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "编辑前需要先选中一行"); return; } // 获取选中的对象 Hero hero = htm.heros.get(index); // 显示编辑Dialog EditDialog ed = new EditDialog(f); ed.tfName.setText(hero.name); ed.tfHp.setText(String.valueOf((int) hero.hp)); ed.setVisible(true); } }); bAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddDialog(f).setVisible(true); updateButtonStatus(); } }); bDelete.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 判断是否选中 int index = t.getSelectedRow(); if (-1 == index) { JOptionPane.showMessageDialog(f, "删除前需要先选中一行"); return; } // 进行确认是否要删除 if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(f, "确认要删除?")) return; // 获取id Hero hero = htm.heros.get(index); int id = hero.id; // 删除 new HeroDAO().delete(id); // 更新table start = 0; updateTable(); updateButtonStatus(); } }); addPageListener(); cb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(!cbListenerEnabled) return; int currentPage = (int) cb.getSelectedItem(); start = (currentPage-1)*number; updateTable(); updateButtonStatus(); } }); JScrollPane sp = new JScrollPane(t); f.setLayout(null); sp.setBounds(0, 0, 394, 200); pOperation.setBounds(0, 200, 394, 50); pPage.setBounds(0, 250, 394, 200); f.add(sp); f.add(pOperation); f.add(pPage); updateButtonStatus(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } private static void addPageListener() { bFirst.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start = 0; updateTable(); updateButtonStatus(); } }); bPre.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start -= number; updateTable(); updateButtonStatus(); } }); bNext.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start += number; updateTable(); updateButtonStatus(); } }); bLast.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { start = last(); updateTable(); updateButtonStatus(); } }); } private static void updateButtonStatus() { int last = last(); // 是否有上一页 if (0 != start) { bFirst.setEnabled(true); bPre.setEnabled(true); } // 是否是第一页 if (0 == start) { bFirst.setEnabled(false); bPre.setEnabled(false); } // 是否是最后一页 if (start == last) { bLast.setEnabled(false); bNext.setEnabled(false); } // 是否有下一页 if (start < last) { bLast.setEnabled(true); bNext.setEnabled(true); } //总共的页数 int pageNumber =last/number+1; cbListenerEnabled = false; cb.removeAllItems(); for (int i = 0; i < pageNumber; i++) { cb.addItem(i+1); } cbListenerEnabled = true; int currentPage = start/number +1; cb.setSelectedItem(currentPage); } static class AddDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); AddDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; new HeroDAO().add(h); JOptionPane.showMessageDialog(f, "提交成功 "); AddDialog.this.setVisible(false); start = 0; updateTable(); } } } }); } } public static void updateTable() { htm.heros = new HeroDAO().list(start, number); t.updateUI(); if (!htm.heros.isEmpty()) t.getSelectionModel().setSelectionInterval(0, 0); } private static boolean checkEmpty(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } return true; } private static boolean checkNumber(JTextField tf, String msg) { String value = tf.getText(); if (0 == value.length()) { JOptionPane.showMessageDialog(null, msg + " 不能为空"); tf.grabFocus(); return false; } try { Integer.parseInt(value); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, msg + " 只能是整数"); tf.grabFocus(); return false; } return true; } static class EditDialog extends JDialog { JLabel lName = new JLabel("名称"); JLabel lHp = new JLabel("血量"); JTextField tfName = new JTextField(); JTextField tfHp = new JTextField(); JButton bSubmit = new JButton("提交"); EditDialog(JFrame f) { super(f); this.setModal(true); int gap = 50; this.setLayout(null); JPanel pInput = new JPanel(); JPanel pSubmit = new JPanel(); pInput.setLayout(new GridLayout(2, 2, gap, gap)); pInput.add(lName); pInput.add(tfName); pInput.add(lHp); pInput.add(tfHp); pSubmit.add(bSubmit); pInput.setBounds(50, 20, 200, 100); pSubmit.setBounds(0, 130, 300, 150); this.add(pInput); this.add(pSubmit); this.setSize(300, 200); this.setLocationRelativeTo(f); bSubmit.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (checkEmpty(tfName, "名称")) { if (checkNumber(tfHp, "hp")) { // 获取id int index = t.getSelectedRow(); int id = htm.heros.get(index).id; String name = tfName.getText(); int hp = Integer.parseInt(tfHp.getText()); Hero h = new Hero(); h.name = name; h.hp = hp; h.id = id; new HeroDAO().update(h); JOptionPane.showMessageDialog(f, "提交成功 "); EditDialog.this.setVisible(false); updateTable(); } } } }); } } private static int last() { // 最后一页开始的位置 int last; int total = new HeroDAO().getTotal(); // 最后一页要看总是是否能够整除每页显示的数量number if (0 == total % number) { // 假设总数是20,那么最后一页开始的位置就是10 last = total - number; } else { // 假设总数是21,那么最后一页开始的位置就是20 last = total - total % number; } return last; } }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2023-09-05 综合练习,完整代码
旧时亭台阁




写得脑阔疼
// ============================================ 启动类 =================================
import character.Hero;
import jdbc.HeroDAO;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.util.function.Consumer;

public class TestGUI {
    public static void main(String[] args) {
        // 窗体
        JFrame frame = new JFrame("LOL");
        frame.setLocation(1000, 500);
        frame.setSize(800, 600);
        frame.setLayout(new BorderLayout());

        // 上下两个主要面板
        JScrollPane centerPanel = new JScrollPane();
        JPanel bottomPanel = new JPanel(new BorderLayout());
        frame.add(centerPanel, BorderLayout.CENTER);
        frame.add(bottomPanel, BorderLayout.SOUTH);

        // 上面板,存放表格组件
        HeroTableModel heroTableModel = new HeroTableModel(10);         // TODO:分页大小设置
        JTable table = new JTable(heroTableModel);
        centerPanel.setViewportView(table);

        // 下面板,增删查改、分页
        JPanel editPanel = new JPanel();
        JPanel pagePanel = new JPanel();
        bottomPanel.add(editPanel, BorderLayout.NORTH);
        bottomPanel.add(pagePanel, BorderLayout.SOUTH);

        // 下方的,增删改 按钮
        JButton addBtn = (JButton) editPanel.add(new JButton("增加"));
        JButton delBtn = (JButton) editPanel.add(new JButton("删除"));
        JButton editBtn = (JButton) editPanel.add(new JButton("编辑"));

        // 下方的,分页按钮
        JButton firstPageBtn = (JButton) pagePanel.add(new JButton("首页"));
        JButton prevPageBtn = (JButton) pagePanel.add(new JButton("上一页"));
        JComboBox<Integer> comboBox = (JComboBox<Integer>) pagePanel.add(new JComboBox<>());
        JButton nextPageBtn = (JButton) pagePanel.add(new JButton("下一页"));
        JButton lastPageBtn = (JButton) pagePanel.add(new JButton("末页"));


        // 增删改 事件绑定
        addBtn.addActionListener(e -> {
            Hero hero = new Hero();
            generateDialog(frame, "添加英雄", hero, dialog -> {
                new HeroDAO().add(hero);
                JOptionPane.showMessageDialog(dialog, "新增成功!");

                heroTableModel.updateDataSource();          // 更新数据源
                table.updateUI();                           // 重新渲染表格
            });
        });
        editBtn.addActionListener(e -> {
            // 获取当前选择的行数据
            if (table.getSelectedRows().length != 1) {
                JOptionPane.showMessageDialog(frame, "需要选择一条数据进行编辑!!!");
                return;
            }
            Hero hero = heroTableModel.getRowData(table.getSelectedRow());
            generateDialog(frame, "编辑英雄", hero, dialog -> {
                new HeroDAO().update(hero);
                JOptionPane.showMessageDialog(dialog, "修改成功!");
                dialog.setVisible(false);

                heroTableModel.updateDataSource();          // 更新数据源
                table.updateUI();                           // 重新渲染表格
            });
        });
        delBtn.addActionListener(e -> {
            int[] selectedRows = table.getSelectedRows();
            if (0 == selectedRows.length) {
                JOptionPane.showMessageDialog(frame, "删除前应该至少选中一行!!!");
                return;
            }
            int opt = JOptionPane.showConfirmDialog(frame, "确认要删除");
            if (JOptionPane.OK_OPTION == opt) {
                StringBuilder sb = new StringBuilder();
                for (int selectedRow : selectedRows) {
                    int id = heroTableModel.getRowData(selectedRow).getId();
                    new HeroDAO().delete(id);
                    sb.append(id).append(",");
                }
                sb.deleteCharAt(sb.length() - 1);
                JOptionPane.showMessageDialog(frame, "成功删除 id 为 [ " + sb + " ] 的数据!!!");

                heroTableModel.updateDataSource();          // 更新数据源
                table.updateUI();                           // 重新渲染表格
            }
        });


        // 分页  事件绑定
        heroTableModel.injectPagerHelper(firstPageBtn,  prevPageBtn, comboBox, nextPageBtn, lastPageBtn);
        firstPageBtn.addActionListener(e -> {
            heroTableModel.setCurrentPageNum(0);
            table.updateUI();
        });
        prevPageBtn.addActionListener(e -> {
            heroTableModel.setCurrentPageNum(heroTableModel.getCurrentPageNum() - 1);
            table.updateUI();
        });
        nextPageBtn.addActionListener(e -> {
            heroTableModel.setCurrentPageNum(heroTableModel.getCurrentPageNum() + 1);
            table.updateUI();
        });
        lastPageBtn.addActionListener(e -> {
            heroTableModel.setCurrentPageNum(heroTableModel.getMaxPageNum());
            table.updateUI();
        });
        comboBox.addItemListener(a -> {
            if (a.getStateChange() == ItemEvent.SELECTED) {
                heroTableModel.setCurrentPageNum((Integer) a.getItem() - 1);
                table.updateUI();
            }
        });


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


    // 增加/编辑 英雄界面
    private static void generateDialog(JFrame frame, String title, Hero hero, Consumer<JDialog> consumer) {
        // 对话框
        JDialog dialog = new JDialog(frame, title, true);
        dialog.setBounds(1200, 700, 200, 150);
        dialog.setResizable(false);
        dialog.setLayout(new FlowLayout());

        // 组件
        dialog.add(new JLabel("名称:"));
        JTextField textFieldOfName = (JTextField) dialog.add(new JTextField(hero.getName()));
        textFieldOfName.setPreferredSize(new Dimension(120, 30));
        dialog.add(new JLabel("血量:"));
        JTextField textFieldOfHp = (JTextField) dialog.add(new JTextField(String.valueOf(hero.getHp())));
        textFieldOfHp.setPreferredSize(new Dimension(120, 30));

        // 提交按钮
        JButton button = (JButton) dialog.add(new JButton("提交"));
        // 提交按钮,响应事件
        button.addActionListener(e -> {
            // 校验输入
            String name = textFieldOfName.getText();
            if (null == name || name.isEmpty()) {
                JOptionPane.showMessageDialog(dialog, "名称为空!!!");
                return;
            }
            String hpStr = textFieldOfHp.getText();
            if (null == hpStr || hpStr.isEmpty()) {
                JOptionPane.showMessageDialog(dialog, "血量为空!!!");
                return;
            }
            float hp;
            try {
                hp = Float.parseFloat(hpStr);
            } catch (Exception e2) {
                JOptionPane.showMessageDialog(dialog, "血量不是数字!!!");
                return;
            }

            hero.setName(name);
            hero.setHp(hp);

            // 行为注入
            consumer.accept(dialog);
        });
        dialog.setVisible(true);
    }


}










// ============================================ 自定义的表格的数据源模型 =================================
import character.Hero;
import jdbc.HeroDAO;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class HeroTableModel extends AbstractTableModel {

    private final HeroDAO dao;

    private final int[] pageStat;

    private JButton[] pageHelper;
    private JComboBox<Integer> pageComboBox;

    private final List<String> headers;

    private List<Hero> heroes;

    public HeroTableModel(int pageSize) {
        dao = new HeroDAO();

        Field[] fields = Hero.class.getDeclaredFields();
        headers = Arrays.stream(fields).map(Field::getName).collect(Collectors.toList());

        pageStat = new int[3];        // 页大小,当前页数,最大页数
        setPageSize(pageSize);
    }

    // 更新当前页的数据
    public void updateDataSource() {
        calculateMaxPageNum();
        int cur  = getCurrentPageNum(), size = getPageSize();
        heroes = dao.list(cur * size, size);
    }

    // 获取指定下标的行数据
    public Hero getRowData(int rowIndex) {
        return heroes.get(rowIndex);
    }

    // 注入分页器
    public void injectPagerHelper(JButton first, JButton prev, JComboBox<Integer> comboBox, JButton next, JButton last) {
        pageHelper = new JButton[]{first, prev, next, last};
        pageComboBox = comboBox;
        updatePageHelperStatus();
    }

    public int getCurrentPageNum() {
        return pageStat[1];
    }

    public void setCurrentPageNum(int cur) {
        pageStat[1] = cur;
        updateDataSource();
    }

    public int getPageSize() {
        return pageStat[0];
    }

    public void setPageSize(int pageSize) {
        pageStat[0] = pageSize;
        updateDataSource();
    }

    public int getMaxPageNum() {
        return pageStat[2];
    }

    private void setMaxPageNum(int max) {
        pageStat[2] = max;
        updatePageHelperStatus();
    }

    // 更新分页器的状态
    private void updatePageHelperStatus() {
        if (null == pageHelper || null == pageComboBox) {
            return;
        }

        for (int i = Math.max(0, pageComboBox.getItemCount()); i <= getMaxPageNum(); i++) {
            pageComboBox.addItem(i + 1);
        }
        pageComboBox.setSelectedIndex(getCurrentPageNum());


        if (getCurrentPageNum() == 0) {
            pageHelper[0].setEnabled(false);
            pageHelper[1].setEnabled(false);
        } else {
            pageHelper[0].setEnabled(true);
            pageHelper[1].setEnabled(true);
        }

        if (getCurrentPageNum() < getMaxPageNum()) {
            pageHelper[2].setEnabled(true);
            pageHelper[3].setEnabled(true);
        } else {
            pageHelper[2].setEnabled(false);
            pageHelper[3].setEnabled(false);
        }
    }

    // 计算并更新最大页数
    private void calculateMaxPageNum() {
        int total = dao.getTotal(), size = getPageSize();
        int max = (total + size - 1) / size - 1;
        setMaxPageNum(max);
    }

    @Override
    public int getRowCount() {
        return heroes.size();
    }

    @Override
    public int getColumnCount() {
        return headers.size();
    }

    @Override
    public String getColumnName(int column) {
        return headers.get(column);
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Hero h =  heroes.get(rowIndex);

        Field field = Hero.class.getDeclaredFields()[columnIndex];
        field.setAccessible(true);

        try {
            return field.get(h);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

							


1 个答案

CharlieLong
答案时间:2023-10-16
综合练习答案



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-05-27 JAVA 中级-图形界面-表格综合练习 ——最后两个练习,下拉框反而是最好做的
M_GX




我是按照我思考的方式编写的代码,可能有些地方不符合部分人的阅读习惯
package GUILearn;

import JDBC.HeroDao;
import JDBC.Heros;
import jdk.nashorn.internal.scripts.JO;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;

//在table中仅仅显示10条数据。
//        在下方出现4个按钮
//        首页 上一页 下一页 末页
//借助下拉框实现下拉框分页
public class Day_202205232142 {
    private static int startIndex;
    private static HeroDao hd=new HeroDao();
    private static HeroTableModel heroTableModel=new HeroTableModel();

    public static void main(String[] args) {
        final int countIndex=10;
        String num[];
        if(hd.list().size()%10==0){
            num=new String[(int)(hd.list().size()/10)];
        }else {
            num=new String[(int)(hd.list().size()/10)+1];
        }
        for(int i=0;i<num.length;i++){
            int j=i+1;
            num[i]=String.valueOf(j);
        }

        JFrame f = new JFrame("LOL");
        f.setBounds(200,200,600,400);
        f.setLayout(null);
        f.setResizable(false);

        JTable t=getTable(0,10);
        JScrollPane sp = new JScrollPane(t);
        sp.setBounds(0,0,595,250);

        JButton bAdd=getButton("增加",240,20,80,30);
        JButton bDelete=getButton("删除",240,20,80,30);
        JButton bEdit=getButton("编辑",340,20,80,30);
        JButton bFirst=getButton("首页",85,70,80,30);
        bFirst.setEnabled(false);
        JButton bLeast=getButton("上一页",185,70,80,30);
        bLeast.setEnabled(false);
        JButton bNext=getButton("下一页",355,70,80,30);
        JButton bLast=getButton("末页",455,70,80,30);
        //下拉框
        JComboBox cb=getComboBox(num,285,70,50,30);
        cb.setSelectedIndex(0);//默认选0位

        


        JPanel p=getPanel();
        p.add(cb);
        cb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startIndex=cb.getSelectedIndex();
                System.out.println(startIndex);
                if(startIndex==0){
                    bFirst.setEnabled(false);
                    bLeast.setEnabled(false);
                    bLast.setEnabled(true);
                    bNext.setEnabled(true);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                }else if(startIndex==(int)(hd.list().size()/10)){
                    bFirst.setEnabled(true);
                    bLeast.setEnabled(true);
                    bNext.setEnabled(false);
                    bLast.setEnabled(false);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                }else {
                    bFirst.setEnabled(true);
                    bLeast.setEnabled(true);
                    bNext.setEnabled(true);
                    bLast.setEnabled(true);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                }
            }
        });
        p.add(bAdd);
        t.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                bAdd.setLocation(140,20);
                p.add(bDelete);
                p.add(bEdit);
                p.updateUI();
            }
        });
        bAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialog d=getDialog();
                d.setModal(true);
                d.setResizable(false);
                d.add(getLabel("名称",50,50,80,30));
                d.add(getLabel("血量",50,100,80,30));
                JTextField tfName=getTextField("",100,50,100,30);
                d.add(tfName);
                JTextField tfHp=getTextField("",100,100,100,30);
                d.add(tfHp);

                JButton bSubmit=getButton("提交",100,150,100,30);
                d.add(bSubmit);

                bSubmit.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String name=tfName.getText();
                        String hp=tfHp.getText();
                        Heros hero=new Heros();
                        if(name.length()!=0){
                            hero.name=name;
                        }else {
                            JOptionPane.showMessageDialog(d,"名称不能为空!");
                            tfName.grabFocus();
                            return;
                        }
                        try {
                            hero.hp=Float.valueOf(hp);
                        }catch (Exception ex){
                            JOptionPane.showMessageDialog(d,"血量必须为数字!");
                            tfHp.grabFocus();
                            return;
                        }
                        try {
                            hd.add(hero);
                            JOptionPane.showMessageDialog(d,"提交成功!");
                            heroTableModel.heros=hd.list(0,10);
                            t.getSelectionModel().setSelectionInterval(0,0);
                            sp.updateUI();
                        } catch (SQLException ex) {
                            throw new RuntimeException(ex);
                        }

                    }
                });
            }
        });
        bDelete.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int option=JOptionPane.showConfirmDialog(f,"确认删除?");
                if(option==JOptionPane.OK_OPTION){
                    int row=t.getSelectedRow();//取得选定条目的行号
                    Heros hero=heroTableModel.heros.get(row);//这里必须用heroTM进行调用
                    hd.delete(hero.id);
                    JOptionPane.showMessageDialog(f,"数据删除成功!");
                    heroTableModel.heros=hd.list(0,10);
                    sp.updateUI();
                }

            }
        });
        bEdit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Heros hero=heroTableModel.heros.get(t.getSelectedRow());
                String name= hero.name;
                String hp=String.valueOf(hero.hp);
                JDialog d=getDialog();
                d.setResizable(false);
                d.setModal(true);
                d.add(getLabel("名称",50,50,80,30));
                d.add(getLabel("血量",50,100,80,30));
                JTextField tfName=getTextField(name,100,50,100,30);
                d.add(tfName);
                JTextField tfHp=getTextField(hp,100,100,100,30);
                d.add(tfHp);

                JButton b=getButton("提交",100,150,100,30);
                d.add(b);
                b.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String namex= tfName.getText();
                        String hpx=tfHp.getText();
                        if(namex.length()!=0){
                            hero.name=namex;
                        }else {
                            JOptionPane.showMessageDialog(d,"名称不能为空!");
                            tfName.grabFocus();
                            return;
                        }
                        try {
                            hero.hp=Float.valueOf(hpx);
                        }catch (Exception ex){
                            JOptionPane.showMessageDialog(d,"血量必须为数字!");
                            tfHp.grabFocus();
                            return;
                        }
                        hd.update(hero);
                        JOptionPane.showMessageDialog(d,"数据变更成功!");
                        heroTableModel.heros=hd.list(0,10);
                        sp.updateUI();
                    }
                });

            }
        });
        p.add(bFirst);
        bFirst.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startIndex=0;
                bFirst.setEnabled(false);
                bLeast.setEnabled(false);
                bLast.setEnabled(true);
                bNext.setEnabled(true);
                heroTableModel.heros=hd.list(startIndex*10,countIndex);
                sp.updateUI();
            }
        });
        p.add(bLeast);
        bLeast.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bLast.setEnabled(true);
                bNext.setEnabled(true);
                startIndex-=1;
                System.out.println(startIndex);
                if(startIndex!=0){
                    bFirst.setEnabled(true);
                    bLeast.setEnabled(true);
                    heroTableModel.heros=hd.list(startIndex*10,10);
                    sp.updateUI();
                }else {
                   bFirst.setEnabled(false);
                   bLeast.setEnabled(false);
                   heroTableModel.heros=hd.list(startIndex*10,10);
                   sp.updateUI();
                }
            }
        });
        p.add(bNext);
        bNext.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bFirst.setEnabled(true);
                bLeast.setEnabled(true);
                startIndex+=1;
                System.out.println(startIndex);
                if(startIndex!=(int)(hd.list().size()/10)){
                    bLast.setEnabled(true);
                    bNext.setEnabled(true);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                }else{
                    bLast.setEnabled(false);
                    bNext.setEnabled(false);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                }
            }
        });
        p.add(bLast);
        bLast.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                bFirst.setEnabled(true);
                bLeast.setEnabled(true);
                bNext.setEnabled(false);
                bLast.setEnabled(false);
                if(hd.list().size()%10==0){
                    startIndex=(int)(hd.list().size()/10)-1;
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                    t.getSelectionModel().setSelectionInterval(0,0);
                    startIndex=(int)(hd.list().size()/10);
                }else {
                    startIndex=(int)(hd.list().size()/10);
                    heroTableModel.heros=hd.list(startIndex*10,countIndex);
                    sp.updateUI();
                    t.getSelectionModel().setSelectionInterval(0,0);
                }
            }
        });



        f.add(p);
        f.add(sp);
        f.setDefaultCloseOperation(3);
        f.setVisible(true);
    }
    private static JTable getTable(int startIndex,int countIndex){
        heroTableModel.heros=hd.list(startIndex,countIndex);
        JTable t = new JTable(heroTableModel);
        t.setRowHeight(22);
        return t;
    }
    private static JPanel getPanel(){
        JPanel p = new JPanel();
        p.setBounds(0,245,595,160);
        p.setLayout(null);
        p.setBackground(Color.GRAY);
        return p;
    }
    private static JButton getButton(String name,int x,int y,int width,int height){
        JButton b = new JButton(name);
        b.setBounds(x,y,width,height);
        return b;
    }
    private static JDialog getDialog(){
        JDialog d = new JDialog();
        d.setBounds(300,300,300,300);
        d.setLayout(null);
        d.setVisible(true);
        return d;
    }
    private static JLabel getLabel(String name,int x,int y,int width,int height){
        JLabel label = new JLabel(name);
        label.setBounds(x,y,width,height);
        return label;
    }
    private static JTextField getTextField(String name,int x,int y,int width,int height){
        JTextField tf = new JTextField(name);
        tf.setBounds(x,y,width,height);
        return tf;
    }
    private static JComboBox getComboBox(String[] numbers,int x,int y,int width,int height){
        JComboBox cb = new JComboBox(numbers);
        cb.setBounds(x,y,width,height);
        return cb;
    }

}
应该无异常。。。。吧,试了好几遍,笨办法





回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2022-04-12 能否使用这个分页组件做个jtable分页的使用教程呢?
2022-01-04 练习 - 表格综合练习组合版
2021-03-16 整个表格综合练习题目-打卡答案


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 14 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 JAVA 中级-图形界面-表格综合练习 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图