how2j.cn

-->
下载区
文件名 文件大小
请先登录 2m
增值内容 2m
2m

解压rar如果失败,请用5.21版本或者更高版本的winrar

点击下载 winrar5.21

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

步骤 1 : CategoryService   
步骤 2 : CategoryTableModel   
步骤 3 : CategoryPanel   
步骤 4 : CategoryListener   
步骤 5 : 在CategoryPanel中加上监听器   
步骤 6 : 运行效果   

增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package service; import java.util.Collections; import java.util.List; import dao.CategoryDAO; import dao.RecordDAO; import entity.Category; import entity.Record; public class CategoryService { CategoryDAO categoryDao = new CategoryDAO(); RecordDAO recordDao = new RecordDAO(); public List<Category> list() { List<Category> cs= categoryDao.list(); for (Category c : cs) { List<Record> rs =recordDao.list(c.id); c.recordNumber=rs.size(); } Collections.sort(cs,(c1,c2)->c2.recordNumber-c1.recordNumber); return cs; } public void add(String name) { Category c = new Category(); c.setName(name); categoryDao.add(c); } public void update(int id, String name) { Category c = new Category(); c.setName(name); c.setId(id); categoryDao.update(c); } public void delete(int id) { categoryDao.delete(id); } }
步骤 2 :

CategoryTableModel

edit
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package gui.model; import java.util.List; import javax.swing.table.AbstractTableModel; import entity.Category; import service.CategoryService; public class CategoryTableModel extends AbstractTableModel { String[] columnNames = new String[] { "分类名称", "消费次数"}; // 使用从Service返回的List作为TableModel的数据 public List<Category> cs = new CategoryService().list(); public int getRowCount() { return cs.size(); } public int getColumnCount() { return columnNames.length; } public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } // 先通过cs.get(rowIndex)获取行对应的Category对象 // 然后根据columnIndex返回对应的属性 public Object getValueAt(int rowIndex, int columnIndex) { Category h = cs.get(rowIndex); if (0 == columnIndex) return h.name; if (1 == columnIndex) return h.recordNumber; return null; } }
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package gui.panel; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import entity.Category; import gui.model.CategoryTableModel; import service.CategoryService; import util.ColorUtil; import util.GUIUtil; public class CategoryPanel extends JPanel { static { GUIUtil.useLNF(); } public static CategoryPanel instance = new CategoryPanel(); public JButton bAdd = new JButton("新增"); public JButton bEdit = new JButton("编辑"); public JButton bDelete = new JButton("删除"); String columNames[] = new String[] { "分类名称", "消费次数" }; public CategoryTableModel ctm = new CategoryTableModel(); public JTable t = new JTable(ctm); public CategoryPanel() { GUIUtil.setColor(ColorUtil.blueColor, bAdd, bEdit, bDelete); JScrollPane sp = new JScrollPane(t); JPanel pSubmit = new JPanel(); pSubmit.add(bAdd); pSubmit.add(bEdit); pSubmit.add(bDelete); this.setLayout(new BorderLayout()); this.add(sp, BorderLayout.CENTER); this.add(pSubmit, BorderLayout.SOUTH); } public static void main(String[] args) { GUIUtil.showPanel(CategoryPanel.instance); } public Category getSelectedCategory() { int index = t.getSelectedRow(); return ctm.cs.get(index); } public void updateData() { ctm.cs = new CategoryService().list(); t.updateUI(); t.getSelectionModel().setSelectionInterval(0, 0); if(0==ctm.cs.size()){ bEdit.setEnabled(false); bDelete.setEnabled(false); } else{ bEdit.setEnabled(true); bDelete.setEnabled(true); } } }
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
CategoryListener
package gui.listener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JOptionPane; import entity.Category; import gui.panel.CategoryPanel; import service.CategoryService; public class CategoryListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { CategoryPanel p = CategoryPanel.instance; JButton b = (JButton) e.getSource(); if (b == p.bAdd) { String name = JOptionPane.showInputDialog(null); if (0 == name.length()) { JOptionPane.showMessageDialog(p, "分类名称不能为空"); return; } new CategoryService().add(name); } if (b == p.bEdit) { Category c = p.getSelectedCategory(); int id = c.id; String name = JOptionPane.showInputDialog("修改分类名称", c.name); if (0 == name.length()) { JOptionPane.showMessageDialog(p, "分类名称不能为空"); return; } new CategoryService().update(id, name); } if (b == p.bDelete) { Category c = p.getSelectedCategory(); if (0 != c.recordNumber) { JOptionPane.showMessageDialog(p, "本分类下有消费记录存在,不能删除"); return; } if (JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(p, "确认要删除?")) return; int id = c.id; new CategoryService().delete(id); } p.updateData(); } }
步骤 5 :

在CategoryPanel中加上监听器

edit
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package gui.panel; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import entity.Category; import gui.listener.CategoryListener; import gui.model.CategoryTableModel; import service.CategoryService; import util.ColorUtil; import util.GUIUtil; public class CategoryPanel extends JPanel { static { GUIUtil.useLNF(); } public static CategoryPanel instance = new CategoryPanel(); public JButton bAdd = new JButton("新增"); public JButton bEdit = new JButton("编辑"); public JButton bDelete = new JButton("删除"); String columNames[] = new String[] { "分类名称", "消费次数" }; public CategoryTableModel ctm = new CategoryTableModel(); public JTable t = new JTable(ctm); public CategoryPanel() { GUIUtil.setColor(ColorUtil.blueColor, bAdd, bEdit, bDelete); JScrollPane sp = new JScrollPane(t); JPanel pSubmit = new JPanel(); pSubmit.add(bAdd); pSubmit.add(bEdit); pSubmit.add(bDelete); this.setLayout(new BorderLayout()); this.add(sp, BorderLayout.CENTER); this.add(pSubmit, BorderLayout.SOUTH); addListener(); } public static void main(String[] args) { GUIUtil.showPanel(CategoryPanel.instance); } public Category getSelectedCategory() { int index = t.getSelectedRow(); return ctm.cs.get(index); } public void updateData() { ctm.cs = new CategoryService().list(); t.updateUI(); t.getSelectionModel().setSelectionInterval(0, 0); if(0==ctm.cs.size()){ bEdit.setEnabled(false); bDelete.setEnabled(false); } else{ bEdit.setEnabled(true); bDelete.setEnabled(true); } } public void addListener() { CategoryListener listener = new CategoryListener(); bAdd.addActionListener(listener); bEdit.addActionListener(listener); bDelete.addActionListener(listener); } }
增值内容,请先登录
完整的J2SE桌面项目,从无到有完整的开发流程,涵盖全部52个知识点,154个开发步骤, 一共36个讲解视频,累计时长3小时10分59秒,大小1.94G,充实J2SE项目经验,为简历加上一个有吸引力的砝码
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
运行效果


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


问答区域    
2022-01-09 CategoryTableModel 由 implement TableModel改成现在代码上的"extends AbstractTableModle"
Alex97




一,使用implement TableModel 在"原型_界面类"章节里,categoryTableModle使用的是 implement TableModel,其中有个重写方法,需要重写为 public Class<?> getColumnClass(int columnIndex) { if (columnIndex==0){return String.class;} if (columnIndex==1){return int.class;} return null; }. 不重写的话会报空指针异常,并且分类面板崩溃. 二,改为extends AbstractTableModle 否则,应该提示将"implement TableModle"改成现在代码上的"extends AbstractTableModle",并删除getColumnClass方法


1 个答案

how2j
答案时间:2022-02-02
good!



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢


2021-04-26 当记录过多时,CategoryService.list()使用record来获取recordNumer创建对象过多,不如通过sql语句直接获取到recordNumber
郁蒸十四




不如写个方法用来获取id对应的record条数,mysql的开销远比Java小


1 个答案

how2j
答案时间:2021-04-27
dao 有个 getTotal方法嘛



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢


2021-04-05 建议在CategoryListener类中增加一行name是否是null的判断
2020-12-21 抛了个数组下标越界的异常
2020-11-17 关于新增分类时无法正常显示中文


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

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢