【问题标题】:How do I display a list of items in a JScrollPane?如何在 JScrollPane 中显示项目列表?
【发布时间】:2013-10-16 06:37:08
【问题描述】:

首先,我是一名初学编程的学生,对Java/编程术语了解不多,所以如果你能帮助我,请尝试用更简单的语言来解释。

我正在尝试在 JScrollPane 中显示单词列表。该列表由类 WordList 表示。 JScrollPane 位于另一个名为 WordFinder 的类中。

在 WordFinder 中,代码类似于:

WordList words = new WordList();

// (other GUI code in between)

JScrollPane scrollPane = new JScrollPane(DONT_KNOW);

如果我将“单词”放在 DONT_KNOW 所在的位置,我会收到一条警告说“构造函数 JScrollPane(WordList) 未定义”。我可以理解, JScrollPane 不应该接受这个奇怪的随机类。但是我在那里放什么呢?我知道您可以将 JList 放在 JScrollPane 中,但是如何将 WordList 类转换为 JList(或 JScrollPane 将接受的东西)?

我不确定这是否有帮助,但这是 WordList 类中的代码(不是我写的;它是给我的):

    import java.io.*;
    import java.net.URL;
    import java.text.Collator;
    import java.util.*;

    /**
     * A WordList is a set of words loaded from a file and searchable by substring.
     * A word is defined as a sequence of letters (upper case or lower case).
     * WordSets ignore alphabetic case when comparing, searching, or sorting.
     */
    public class WordList {
        private List words;

        /*
         * Rep invariant: words != null
         */

    public WordList() {

    }

    public void load(InputStream in) throws IOException {
        Collator c = Collator.getInstance();
        c.setStrength(Collator.PRIMARY);
        Set s = new TreeSet(c);

        StreamTokenizer tok = new StreamTokenizer(new InputStreamReader(in));
        tok.resetSyntax();
        tok.wordChars('a', 'z');
        tok.wordChars('A', 'Z');

        while (tok.nextToken() != StreamTokenizer.TT_EOF) {
            if (tok.ttype == StreamTokenizer.TT_WORD)
                s.add(tok.sval);
        }

        words = new ArrayList(s);
    }

    public List find(String s) {
        if (s.length() == 0) {
            return Collections.unmodifiableList(words);
        }

        s = s.toLowerCase();

        List l = new ArrayList();
        for (Iterator i = words.iterator(); i.hasNext();) {
            String word = (String) i.next();
            if (word.toLowerCase().indexOf(s) != -1)
                l.add(word);
        }
        return l;
    }

    /**
     * Main method. Demonstrates how to use this class.
     * 
     * @param args
     *            Command-line arguments. Ignored.
     */
    public static void main(String[] args) {
        WordList words = new WordList();

        // Create the word list from a resource.
        // The words file must be in the same directory (or jar file directory)
        // as this class.
        URL url = WordList.class.getResource("words.txt");
        if (url == null)
            throw new RuntimeException("Missing resource: words");
        try {
            words.load(url.openStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // Print all the words containing "ph"
        List matches = words.find("holst");
        for (Iterator i = matches.iterator(); i.hasNext();) {
            System.out.println(i.next());
        }
    }
}

【问题讨论】:

    标签: java swing list jscrollpane jlist


    【解决方案1】:

    在 JScrollPane 中使用 JList。

    这是示例。

        JList list;
        DefaultListModel listModel;
        listModel = new DefaultListModel();
        listModel.addElement("word1");
        listModel.addElement("word2");
        listModel.addElement("word3");
    
        //Create the list and put it in a scroll pane.
        list = new JList(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setSelectedIndex(0);
        list.addListSelectionListener(this);
        list.setVisibleRowCount(5);
        JScrollPane listScrollPane = new JScrollPane(list);
    

    以上例子来自ListDemo.java

    在 JList 上结帐 Oracle's tutorial

    【讨论】:

      【解决方案2】:

      我认为您的自定义类 WordList 应该继承 JList 以使其工作(即作为 JScrollPane 的参数)。

      类似:

      public class WordList extends JList<Object> {....}
      

      之后就可以写了:

       WordList words = new WordList();
      
       JScrollPane scrollPane = new JScrollPane(words);
      

      【讨论】:

        【解决方案3】:

        假设您的单词由Word 类描述,并且您有List&lt;Word&gt;(即java.util.List&lt;&gt;)的单词;

        您必须创建列表模型,该模型将成为JList 的模型;

        类似:

            // you have list of words - wordList
            List<Word> wordList= new ArrayList<Word>();
        
            // create list model for JList
            DefaultListModel<Word> model = new DefaultListModel<Word>();
            // add all words from wordList to model
            for(Word word : wordList){
                model.addElement(word);
            }
        
            // create JList with model - model
            JList<Word> list = new JList<Word>(model);
        
           // create scroll pane for scrolling JList
            JScrollPane scrollPane = new JScrollPane(list);
        

        如果您的单词是String 的实例,您可以将所有Word 替换为String

        还有一个提示,您可能已经直接创建了列表模型 (DefaultListModel&lt;&gt;) 来存储单词列表,而不是 java.util.List&lt;&gt;。因此,您不必维护两个列表(DefaultListModel&lt;&gt;java.util.List&lt;&gt;)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多