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公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2024-07-17 综合练习
虚心求学




1、DAO 读取数据库所有数据 2、结合 JTable 的 getSelectedRow 方法记录用户选中的元素。 3、结合事件监听和 DAO 实现 GUI 界面上的更改 同步 数据库的更新 4、使用 DAO 分页查找功能,判断页面逻辑,分页显示 5、结合 JComboBox 实现下拉框 页面跳转,并增加翻页 同步 下拉框的选项
加载中
public static void main(String[] args) {
		ItemDAO dao = new ItemDAO();
		JFrame f = new JFrame("LoL");
		f.setSize(800, 600);
		f.setLocation(200, 100);
		f.setLayout(new BorderLayout());
		ItemTableModel htm = new ItemTableModel();
		final int showItemNum = 20;
		htm.items = dao.list(0, showItemNum);
		JTable t = new JTable(htm);

		// 设置选择模式为 只能选中一行
		t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		// 选中第一行 (基本0)
		t.getSelectionModel().setSelectionInterval(0, 0);
		JPanel p = new JPanel();
		p.setLayout(new FlowLayout());

		JLabel lalName = new JLabel("名称");
		JTextField txtName = new JTextField();
		JLabel lalPrice = new JLabel("价格");
		JTextField txtPrice = new JTextField();
		JButton btninsert = new JButton("添加");
		JButton btndelete = new JButton("删除");
		JButton btnok = new JButton("提交");
		JButton btnUpdate = new JButton("编辑");
		JDialog dialog = new JDialog();
		dialog.setLocationByPlatform(false);
		dialog.setSize(200, 180);
		dialog.setLocation(f.getX() + (f.getWidth() - dialog.getWidth()) / 2,
				f.getY() + (f.getHeight() - dialog.getHeight()) / 2);
		// dialog.setLocation(350, 200);
		dialog.setModal(true);
		dialog.setVisible(false);
		dialog.setLayout(new FlowLayout());
		Item first = htm.items.get(0);
		final Item selectItem = new Item(first.id, first.name, first.price);
		JLabel lalID = new JLabel("ID:             ");
		JLabel txtID = new JLabel(String.valueOf(selectItem.id));
		final int[] tempPage = new int[] { 0 };
		// 使用selection监听器来监听table的哪个条目被选中
		t.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

			// 当选择了某一行的时候触发该事件
			public void valueChanged(ListSelectionEvent e) {
				// 获取哪一行被选中了
				int row = t.getSelectedRow();
				// 根据选中的行,到HeroTableModel中获取对应的对象
				selectItem.id = (int) htm.getValueAt(row, 0);
				selectItem.name = (String) htm.getValueAt(row, 1);
				selectItem.price = (float) htm.getValueAt(row, 2);

			}
		});
		btninsert.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dialog.setTitle("添加数据");
				dialog.setVisible(true);
			}
		});
		btndelete.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dialog.setTitle("删除确认");
				txtID.setText(String.valueOf(selectItem.id));
				txtName.setText(selectItem.name);
				txtPrice.setText(String.valueOf(selectItem.price));
				dialog.setVisible(true);
			}
		});
		btnUpdate.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				dialog.setTitle("编辑数据");
				txtID.setText(String.valueOf(selectItem.id));
				txtName.setText(selectItem.name);
				txtPrice.setText(String.valueOf(selectItem.price));
				dialog.setVisible(true);
			}
		});
		btnok.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String name = txtName.getText().trim();
				String price = txtPrice.getText().trim();
				if (isNullOrEmpty(name) || isNullOrEmpty(price)) {
					JOptionPane.showMessageDialog(f, "输入不得为空");
				} else if (selectItem.id < 0) {

				} else {
					try {

						float priceNum = Float.parseFloat(price);
						String title = dialog.getTitle();
						if (title.startsWith("添加")) {
							dao.add(new Item(name, priceNum));
							JOptionPane.showMessageDialog(f, "添加成功!");
							// 根据选中的行,到HeroTableModel中获取对应的对象
							selectItem.id = (int) htm.getValueAt(0, 0);
							selectItem.name = (String) htm.getValueAt(0, 1);
							selectItem.price = (float) htm.getValueAt(0, 2);
							t.getSelectionModel().setSelectionInterval(0, 0);
						} else if (title.startsWith("删除")) {
							dao.delete(selectItem.id);
							JOptionPane.showMessageDialog(f, "删除成功!");
						} else if (title.startsWith("编辑")) {
							dao.update(new Item(selectItem.id, name, priceNum));
							JOptionPane.showMessageDialog(f, "更新成功!");
						}
						dialog.setVisible(false);

						htm.items.clear();
						htm.items = dao.list(tempPage[0] * showItemNum, showItemNum);
						dialog.setVisible(false);
						t.updateUI();
						return;
					} catch (Exception e2) {
						JOptionPane.showMessageDialog(f, "参数输入不合理,价格需为数值!");
					}

				}

			}
		});
		JButton btnFirst = new JButton("首页");
		JButton btnUp = new JButton("上一页");
		JButton btnDown = new JButton("下一页");
		JButton btnEnd = new JButton("末页");
		btnFirst.setEnabled(false);
		btnUp.setEnabled(false);
		Integer[] pages = new Integer[dao.count() / showItemNum+1];
		for (int i = 0; i < pages.length; i++) {
			pages[i] = i+1;
		}
		final JComboBox<Integer> cb = new JComboBox<>(pages);
		cb.setSelectedItem(1) ;
		cb.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    // 处理项目改变的代码
                    int id = (int) cb.getSelectedItem()-1;
                    if(id==0)
                    {
                    	btnFirst.setEnabled(false);
                    	btnUp.setEnabled(false);
                    }
                    if(id==cb.getItemCount()-1)
                    {
                    	btnDown.setEnabled(false);
                    	btnEnd.setEnabled(false);
                    }
                    if(id>0)
                    {
                    	btnUp.setEnabled(true);
                    	btnFirst.setEnabled(true);
                    }
                    if(id<cb.getItemCount()-1)
                    {
                    	btnDown.setEnabled(true);
                    	btnEnd.setEnabled(true);
                    }
    				tempPage[0] = id;
    				htm.items = dao.list(id*showItemNum, showItemNum);
    				t.updateUI();
    				renewSelect(t, selectItem, htm);
    				//cb.setSelectedItem(tempPage[0]) ;
                }
            }
        });
		
		
		
		

		btnFirst.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				btnFirst.setEnabled(false);
				btnUp.setEnabled(false);
				btnDown.setEnabled(true);
				btnEnd.setEnabled(true);
				htm.items = dao.list(0, showItemNum);
				tempPage[0] = 0;
				t.updateUI();
				renewSelect(t, selectItem, htm);
				cb.setSelectedItem(tempPage[0]) ;
			}
		});
		btnUp.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (tempPage[0] < 1) {
					return;
				}
				btnDown.setEnabled(true);
				btnEnd.setEnabled(true);
				int now = tempPage[0] - 1;
				now *= showItemNum;
				htm.items = dao.list(now, showItemNum);
				t.updateUI();
				tempPage[0]--;
				if (tempPage[0] == 0) {
					btnUp.setEnabled(false);
					btnFirst.setEnabled(false);
				}
				renewSelect(t, selectItem, htm);
				cb.setSelectedItem(tempPage[0]+1) ;
			}
		});
		btnDown.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				btnUp.setEnabled(true);
				btnFirst.setEnabled(true);
				int total = dao.count();
				int max = total / showItemNum;
				int now = tempPage[0] + 1;
				if (now >= max) {
					now = max;
					now = now * showItemNum;
					tempPage[0] = max;
					htm.items = dao.list(now, total % showItemNum);
					btnDown.setEnabled(false);
					btnEnd.setEnabled(false);
					t.updateUI();
					cb.setSelectedItem(tempPage[0]) ;
					renewSelect(t, selectItem, htm);
					return;
				}
				now = now * showItemNum;
				tempPage[0]++;
				htm.items = dao.list(now, showItemNum);
				t.updateUI();
				renewSelect(t, selectItem, htm);
				cb.setSelectedItem(tempPage[0]+1) ;
			}
		});
		btnEnd.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				btnUp.setEnabled(true);
				btnFirst.setEnabled(true);
				int total = dao.count();
				int max = total / showItemNum;
				int now = max;
				now = now * showItemNum;
				tempPage[0] = max;
				htm.items = dao.list(now, now + max % showItemNum);
				btnDown.setEnabled(false);
				btnEnd.setEnabled(false);
				t.updateUI();
				renewSelect(t, selectItem, htm);
				cb.setSelectedItem(tempPage[0]) ;
			}
		});

		txtPrice.setPreferredSize(new Dimension(100, 20));
		txtName.setPreferredSize(new Dimension(100, 20));
		JPanel pbotoom = new JPanel();
		pbotoom.setLayout(new FlowLayout());

		JPanel newP = new JPanel();
		newP.setLayout(new GridLayout(1, 2));
		newP.add(lalID);
		newP.add(txtID);

		// insertIntoContainerNextLine(dialog, lalID, txtID);
		insertIntoContainerNextLine(dialog, newP);
		insertIntoContainerNextLine(dialog, lalName, txtName);
		insertIntoContainerNextLine(dialog, lalPrice, txtPrice);
		insertIntoContainerNextLine(dialog, btnok);

		JPanel page = new JPanel();
		page.setLayout(new BorderLayout());
		JPanel pageTop = new JPanel();
		JPanel pageDown = new JPanel();
		insertIntoContainerNextLine(pageTop, btninsert);
		insertIntoContainerNextLine(pageTop, btndelete);
		insertIntoContainerNextLine(pageTop, btnUpdate);

		insertIntoContainerNextLine(pageDown, btnFirst);
		insertIntoContainerNextLine(pageDown, btnUp);
		insertIntoContainerNextLine(pageDown, cb);		
		insertIntoContainerNextLine(pageDown, btnDown);
		insertIntoContainerNextLine(pageDown, btnEnd);
		pageTop.setLayout(new FlowLayout());
		pageDown.setLayout(new FlowLayout());
		page.add(pageTop, BorderLayout.NORTH);
		page.add(pageDown, BorderLayout.SOUTH);
		f.add(page, BorderLayout.SOUTH);

		t.getColumnModel().getColumn(0).setPreferredWidth(3);
		JScrollPane sp = new JScrollPane(t);

		f.add(sp, BorderLayout.CENTER);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		f.setVisible(true);

	}

	public static void renewSelect(JTable t, Item selectItem, ItemTableModel htm) {
		// 获取哪一行被选中了
		int row = t.getSelectedRow();
		// 根据选中的行,到HeroTableModel中获取对应的对象
		selectItem.id = (int) htm.getValueAt(row, 0);
		selectItem.name = (String) htm.getValueAt(row, 1);
		selectItem.price = (float) htm.getValueAt(row, 2);
	}

	public static void insertIntoContainerNextLine(Container f, Component... cs) {
		JPanel nextLineP = new JPanel();
		nextLineP.setLayout(new FlowLayout());
		for (Component c : cs) {
			nextLineP.add(c);
		}
		f.add(nextLineP);
	}

							





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





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 中级-图形界面-表格综合练习 ——最后两个练习,下拉框反而是最好做的
2022-04-12 能否使用这个分页组件做个jtable分页的使用教程呢?
2022-01-04 练习 - 表格综合练习组合版


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

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

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

上传截图