[JAVA Programming] 关于JList的一点笔记
2014-10-30 00:33
253 查看
这次写JAVA课的大作业,首先不得不佩服所给的dictionary.txt文件的厉害之处啊,各种大小写、连字符还有各种词组的不同情况在自己测试的时候都中奖了,我该高兴么...
其实要求不高,大概就是一个词典的查询软件,提供了后台词典,只要完成其中的文件I/O,进行String的处理就可以了。
下面其实主要是一些算法问题,查找的话,既然有序(但是从某些角度说,'-'的值要比a-z小啊,但是在dictionary中的顺序却不是这样啊~~所以我暴力地进行了一次QuickSort...)果断O(logn)。不过鉴于变态的要求联想的功能,我就怂了,只能稍微修改了下这个quicksort啊...不过JAVA中String也是蛮厉害的,compareToIgnoreCase,还有什么split简直是福利啊~~也由此中枪了'-'的问题.....
关于其中的纠错问题,就厚颜无耻地选了一个Levenshtein Distance(编辑距离)计算啊,还能控制精度,不亦乐乎...
下面给出Levenshtein Distance计算的函数....
说了这么多,我就来说说主题,JList...
Question 1 : JList的Listeners
首先就吃了一个ListSelectionListener的亏啊,结果因为这个GUI中的其他Listeners有冲突,遂抛弃之,改用MouseListener和KeyListener(Only Up and Down),这才得以解决。。。泪目。。。
Question 2 : 动态的JList
因为JList要实时更新,所以默认的JList似乎办不到,这个时候Google之(最近学校宿舍可以直接上啊~爽!!),用一个DefaultListModel,就能够进行add和delete JList中的项目啦~~
Question 3 : JList上的特效
为了美观,我想要把JList上选中的项表示的明显一些,就是加粗,字号增大一号,但是JList本身似乎没有单独设置selectedItem的函数,这个时候就要把JList中的项目选为JLabel的sub-class,而不是简单的String了...
里面还是很复杂的...首先要定义一个Item的类,用来定义要放进去的东西,感觉String也是可以的啊...
这个时候就可以用CellRenderer来实现格式的设置啦~~
好啦~这个时候,这样定义我们的JList就可以啦~这样选择的那项就会有一些特殊效果啦~~~
效果图,还不错看吧~~
其实,我还有一个小彩蛋的啊,因为要实现如果用户输入一个错误的单词,要尽可能地根据字典内的单词进行纠错啊,这个时候我加了一个doge,不服来辩!!不知道会不会被杀掉...
其实要求不高,大概就是一个词典的查询软件,提供了后台词典,只要完成其中的文件I/O,进行String的处理就可以了。
下面其实主要是一些算法问题,查找的话,既然有序(但是从某些角度说,'-'的值要比a-z小啊,但是在dictionary中的顺序却不是这样啊~~所以我暴力地进行了一次QuickSort...)果断O(logn)。不过鉴于变态的要求联想的功能,我就怂了,只能稍微修改了下这个quicksort啊...不过JAVA中String也是蛮厉害的,compareToIgnoreCase,还有什么split简直是福利啊~~也由此中枪了'-'的问题.....
关于其中的纠错问题,就厚颜无耻地选了一个Levenshtein Distance(编辑距离)计算啊,还能控制精度,不亦乐乎...
下面给出Levenshtein Distance计算的函数....
private final int distance(String x, String y) { int m = x.length(); int n = y.length(); int[][] T = new int[m + 1][n + 1]; T[0][0] = 0; for (int j = 0; j < n; j++) { T[0][j + 1] = T[0][j] + ins(y, j); } for (int i = 0; i < m; i++) { T[i + 1][0] = T[i][0] + del(x, i); for (int j = 0; j < n; j++) { T[i + 1][j + 1] = min(T[i][j] + sub(x, i, y, j), T[i][j + 1] + del(x, i), T[i + 1][j] + ins(y, j)); } } return T[m] ; } private int sub(String x, int xi, String y, int yi) { return x.charAt(xi) == y.charAt(yi) ? 0 : 1; } private int ins(String x, int xi) { return 1; } private int del(String x, int xi) { return 1; } private int min(int a, int b, int c) { return Math.min(Math.min(a, b), c); }
说了这么多,我就来说说主题,JList...
Question 1 : JList的Listeners
首先就吃了一个ListSelectionListener的亏啊,结果因为这个GUI中的其他Listeners有冲突,遂抛弃之,改用MouseListener和KeyListener(Only Up and Down),这才得以解决。。。泪目。。。
Question 2 : 动态的JList
因为JList要实时更新,所以默认的JList似乎办不到,这个时候Google之(最近学校宿舍可以直接上啊~爽!!),用一个DefaultListModel,就能够进行add和delete JList中的项目啦~~
Question 3 : JList上的特效
为了美观,我想要把JList上选中的项表示的明显一些,就是加粗,字号增大一号,但是JList本身似乎没有单独设置selectedItem的函数,这个时候就要把JList中的项目选为JLabel的sub-class,而不是简单的String了...
里面还是很复杂的...首先要定义一个Item的类,用来定义要放进去的东西,感觉String也是可以的啊...
/** * MyListItem.java * */ public class MyListItem { String text; public MyListItem(String text) { this.text=text; } public String getString() { return text; } public void setString(String s) { text=s; } }
这个时候就可以用CellRenderer来实现格式的设置啦~~
public class MyCellRenderer extends JLabel implements ListCellRenderer { private static final Font font1 = new Font("Palatino Linotype",Font.PLAIN,13); private static final Font font2 = new Font("Palatino Linotype",Font.BOLD+Font.ITALIC,14); private static final Color color1 = new Color(176,196,222); //for the JLabel default to be transparent, so setOpaque true to set the background color //http://huangqiqing123.iteye.com/blog/1678208 public MyCellRenderer() { this.setOpaque(true); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { MyListItem myItem=(MyListItem)value; this.setText(myItem.getString()); if(isSelected) { this.setFont(font2); this.setBackground(color1); } else { this.setFont(font1); this.setBackground(Color.WHITE); } return this; } }
好啦~这个时候,这样定义我们的JList就可以啦~这样选择的那项就会有一些特殊效果啦~~~
private JList<MyListItem> jltWordlist = new JList<MyListItem>(); private final DefaultListModel<MyListItem> model = new DefaultListModel<MyListItem>(); jltWordlist.setCellRenderer(new MyCellRenderer());
效果图,还不错看吧~~
其实,我还有一个小彩蛋的啊,因为要实现如果用户输入一个错误的单词,要尽可能地根据字典内的单词进行纠错啊,这个时候我加了一个doge,不服来辩!!不知道会不会被杀掉...
相关文章推荐
- 关于DrillThrough的一点笔记
- 关于BUG_ON()的一点笔记
- 关于BGP的一点笔记
- 关于刘冬大侠Spring.NET系列学习笔记3的一点勘正
- java学习笔记1-关于throw和throws的一点总结
- web2py 关于MCV入门的一点笔记
- 一点关于红外线套接字IrSock的笔记
- 关于华为的一点笔记和思考 推荐
- (笔记)关于LM3S片内FLASH编程的一点建议
- 关于String替换操作的一点笔记
- 关于main参数和inp.c代码阅读的一点笔记
- [笔记].关于Nios II的数据类型的一点想法
- 关于Quartz的一点笔记
- 关于JAVA多线程编程的一点笔记
- 关于BUG_ON()的一点笔记
- us/os ii 学习笔记 20100421 关于os的一点宏观理解
- 关于同步异步阻塞非阻塞一点笔记
- 关于new的一点笔记
- 关于tar的一点笔记
- 关于iOS的UIView的一点笔记