zoukankan      html  css  js  c++  java
  • [JAVA Programming] 关于JList的一点笔记

    这次写JAVA课的大作业,首先不得不佩服所给的dictionary.txt文件的厉害之处啊,各种大小写、连字符还有各种词组的不同情况在自己测试的时候都中奖了,我该高兴么...

    其实要求不高,大概就是一个词典的查询软件,提供了后台词典,只要完成其中的文件I/O,进行String的处理就可以了。

    下面其实主要是一些算法问题,查找的话,既然有序(但是从某些角度说,'-'的值要比a-z小啊,但是在dictionary中的顺序却不是这样啊~~所以我暴力地进行了一次QuickSort...)果断O(logn)。不过鉴于变态的要求联想的功能,我就怂了,只能稍微修改了下这个quicksort啊...不过JAVA中String也是蛮厉害的,compareToIgnoreCase,还有什么split简直是福利啊~~也由此中枪了'-'的问题.....

    关于其中的纠错问题,就厚颜无耻地选了一个Levenshtein Distance(编辑距离)计算啊,还能控制精度,不亦乐乎...

    下面给出Levenshtein Distance计算的函数....

     1     private final int distance(String x, String y) {
     2         int m = x.length();
     3         int n = y.length();
     4         int[][] T = new int[m + 1][n + 1];
     5         T[0][0] = 0;
     6         for (int j = 0; j < n; j++) {
     7             T[0][j + 1] = T[0][j] + ins(y, j);
     8         }
     9         for (int i = 0; i < m; i++) {
    10             T[i + 1][0] = T[i][0] + del(x, i);
    11             for (int j = 0; j < n; j++) {
    12                 T[i + 1][j + 1] =  min(T[i][j] + sub(x, i, y, j), T[i][j + 1] + del(x, i),
    13                     T[i + 1][j] + ins(y, j));
    14             }
    15         }
    16         return T[m][n];
    17     }
    18     
    19     private int sub(String x, int xi, String y, int yi) {
    20           return x.charAt(xi) == y.charAt(yi) ? 0 : 1;
    21     }
    22     private int ins(String x, int xi) {
    23         return 1;
    24     }
    25     private int del(String x, int xi) {
    26           return 1;
    27     }
    28     private int min(int a, int b, int c) {
    29         return Math.min(Math.min(a, b), c);
    30     }

    说了这么多,我就来说说主题,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也是可以的啊...

     1 /** 
     2  * MyListItem.java
     3  * */
     4 public class MyListItem {    
     5     String text;
     6     
     7     public MyListItem(String text) {
     8         this.text=text;
     9     }
    10     
    11     public String getString() {
    12         return text;
    13     }
    14     
    15     public void setString(String s) {
    16         text=s;
    17     } 
    18 }

    这个时候就可以用CellRenderer来实现格式的设置啦~~

     1 public class MyCellRenderer extends JLabel implements ListCellRenderer {
     2     
     3     private static final Font font1 = new Font("Palatino Linotype",Font.PLAIN,13);
     4     private static final Font font2 = new Font("Palatino Linotype",Font.BOLD+Font.ITALIC,14);
     5     private static final Color color1 = new Color(176,196,222);
     6     //for the JLabel default to be transparent, so setOpaque true to set the background color 
     7     //http://huangqiqing123.iteye.com/blog/1678208
     8     public MyCellRenderer() {
     9         this.setOpaque(true);
    10     }
    11     
    12     public Component getListCellRendererComponent(JList list,
    13             Object value,
    14             int index,
    15             boolean isSelected,
    16             boolean cellHasFocus) {
    17             MyListItem myItem=(MyListItem)value;
    18             this.setText(myItem.getString());
    19             if(isSelected) {
    20                 this.setFont(font2);
    21                 this.setBackground(color1);
    22             }
    23             else {
    24                 this.setFont(font1);
    25                 this.setBackground(Color.WHITE);
    26             }
    27                 
    28             return this;             
    29           }    
    30 }

    好啦~这个时候,这样定义我们的JList就可以啦~这样选择的那项就会有一些特殊效果啦~~~

    1 private JList<MyListItem> jltWordlist = new JList<MyListItem>();
    2 private final DefaultListModel<MyListItem> model = new DefaultListModel<MyListItem>(); 
    3 jltWordlist.setCellRenderer(new MyCellRenderer());

    效果图,还不错看吧~~

    其实,我还有一个小彩蛋的啊,因为要实现如果用户输入一个错误的单词,要尽可能地根据字典内的单词进行纠错啊,这个时候我加了一个doge,不服来辩!!不知道会不会被杀掉...

  • 相关阅读:
    古典密码仿射密码Affine
    git 修改远程仓库地址的方法
    git 修改已经 commit 的用户名和邮箱
    git 调整commit之间的顺序
    Go 逃逸分析
    docker 镜像中的 @sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 (digest)是什么意思
    Docker镜像列表中的<none>:<none>是什么镜像
    github 下fork后如何同步源的新更新内容
    SQL 中 exists 的用法
    OLEDB的Excel的IMEX和HDR是什么意思
  • 原文地址:https://www.cnblogs.com/godfray/p/4060999.html
Copyright © 2011-2022 走看看