2014-10-17 113 views
0

我試圖打開一個文本文件使用JFilechooser並將字符串放入JList中。我認爲所有的字符串進入列表,但我不知道爲什麼字符串不出現在JScrollPane上。 grouplayout有什麼問題嗎?我不知道是什麼改變..JList不顯示JScrollPane

import javax.swing.*; 

import java.awt.*; 
import java.awt.event.*; 
import java.net.*; 
import java.io.*; 
import java.util.*; 
import java.util.List; 

public class WordFinder extends JFrame implements ActionListener { 

    private WordList words = new WordList(); 

    private JScrollPane scroll; 
    private JLabel label; 
    private JLabel word; 
    private JTextField textArea; 
    private JButton button; 

    private JMenuBar menuBar; 
    private JMenu menu; 
    private JMenuItem menuItem, menuItem2; 

    private JFileChooser fc; 

    private JList list; 


    static private final String newline = "\n"; 

    private int lineCount; 



    public WordFinder() { 
     super("Word Finder"); 

     fc = new JFileChooser(); 
     fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); 

     menuBar = new JMenuBar(); 
     menu = new JMenu("File"); 
     menuBar.add(menu); 

     menuItem = new JMenuItem("Open..."); 
     menuItem.addActionListener(this); 

     menuItem2 = new JMenuItem("Exit"); 
     menuItem2.addActionListener(this); 

     menu.add(menuItem); 
     menu.add(menuItem2); 
     setJMenuBar(menuBar); 

     label = new JLabel("Find: "); 

     word = new JLabel(lineCount + " words total"); 

     textArea = new JTextField(); 
     textArea.setEditable(true); 
     textArea.setPreferredSize(new Dimension(200, 20)); 


     button = new JButton("Clear"); 
     button.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         textArea.setText(""); 
        } 
       }); 

     scroll = makeListView(); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setPreferredSize(new Dimension(200, 230)); 

     GroupLayout layout = new GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setAutoCreateGaps(true); 
     layout.setAutoCreateContainerGaps(true); 

     layout.setHorizontalGroup(layout.createSequentialGroup() 
       .addComponent(label) 
       .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
         .addComponent(textArea) 
         .addComponent(word) 
         .addComponent(scroll)) 
       .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
         .addComponent(button))); 

     layout.setVerticalGroup(layout.createSequentialGroup() 
       .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) 
         .addComponent(label) 
         .addComponent(textArea) 
         .addComponent(button)) 
       .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
         .addComponent(word)) 
       .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)) 
         .addComponent(scroll)); 

     setVisible(true); 
     pack(); 
     // call System.exit() when user closes the window 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 


    private JScrollPane makeListView() { 
    //  String[] labels = {"1", "2", "3"}; 
    //  list = new JList(labels); 

     JScrollPane listScroller = new JScrollPane(list); 
     return listScroller; 
    } 

    private void updateListView(DefaultListModel listModel) { 
     list = new JList(listModel); 
     scroll = new JScrollPane(list); 
    } 

    public void actionPerformed(ActionEvent e) { 

     DefaultListModel listModel = new DefaultListModel(); 

     if (e.getSource() == menuItem) { 
      int returnVal = fc.showOpenDialog(WordFinder.this); 

      if (returnVal == JFileChooser.APPROVE_OPTION) { 
       File file = fc.getSelectedFile(); 
       String fileName = file.getAbsolutePath(); 

       try { 
        FileReader files = new FileReader(fileName); 
        BufferedReader br = new BufferedReader(files); 

        String str;     
        while((str = br.readLine()) != null) { 
         listModel.addElement(str); 
         //System.out.println(str); 
         lineCount++; 
        } 
        System.out.println(lineCount); 

        updateListView(listModel); 
        br.close(); 
       } catch (Exception ex) { 
        ex.printStackTrace(System.out); 
        System.out.println("can't read file"); 
       } 

       System.out.println("Opening: " + file.getName() + newline); 
      } 
     } else if (e.getSource() == menuItem2) { 
      setVisible(false); 
      dispose(); 
     } 
    } 


    /** 
    * Main method. Makes and displays a WordFinder window. 
    * @param args Command-line arguments. Ignored. 
    */ 
    public static void main(String[] args) { 
     // In general, Swing objects should only be accessed from 
     // the event-handling thread -- not from the main thread 
     // or other threads you create yourself. SwingUtilities.invokeLater() 
     // is a standard idiom for switching to the event-handling thread. 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // Make and display the WordFinder window. 
       new WordFinder(); 
      } 
     }); 
    }  
} 

回答

1

當你調用makeListViewJListnull,因爲它尚未初始化尚未...所以,你基本上是說scroll = new JScrollPane(null); ......這是不特別有幫助......

接下來,當你調用updateListView,創建JListJScrollPane的新實例,什麼也不做與他們...

private void updateListView(DefaultListModel listModel) { 
    list = new JList(listModel); 
    scroll = new JScrollPane(list); 
} 

因此他們絕不會在屏幕上顯示...

爲了改善這種情況,你需要做一些修改...

  1. 創建JList的一個實例,並將其分配給實例字段list,創建JScrollPane
  2. 不是創建listscroll的新實例之前,簡單地使用JList#setModel

你可能也想看看Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

隨着JList,您通過使用JList#setVisibleRowCountJList#setPrototypeCellValue

影響 JScrollPane的大小