2015-09-27 49 views
0

我正在嘗試爲用戶添加一個BLANK JList以查看befor元素。在所有發生的事情上,我正在使用JFileChooser來選擇要添加到列表中的txt文檔,然後每個txt文檔中的元音被計數並顯示在另一個列表中。在用戶選擇任何內容之前該列表必須可見,並且列表必須爲空。是的,有兩個空JList,但很明顯,如果我可以與另一個很容易獲得幫助。到目前爲止,互聯網上沒有任何地方涉及這一特定主題。如何以指定的大小製作空白JList?沒有空元素

設置行計數(可見)不起作用,也不設置setsize()。除非我用錯了。請用例子來解釋。提前致謝!

一個下面的例子: Example Layout

代碼:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.*; 

import javax.swing.*; 

public class VowelCounterApp extends JFrame implements ActionListener 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    JPanel panel1 = new JPanel(); 
    JPanel panel2 = new JPanel(); 
    JScrollPane scrollPane = new JScrollPane(); 
    JList selectList = new JList(); 
    JList showList = new JList(); 
    JFileChooser fileChooser = new JFileChooser(); 
    JButton addFiles = new JButton("Add Files"); 
    JButton process = new JButton("Process"); 
    JButton clear = new JButton("Clear"); 
    JButton help = new JButton("Help"); 


    public VowelCounterApp() 
    { 
     JFrame appWindow = new JFrame("Vowel Counter"); 

     appWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     appWindow.setSize(1500, 600); 

     appWindow.setLayout(new BorderLayout()); 

     appWindow.setVisible(true); 

     appWindow.add(panel1, BorderLayout.WEST); 
     appWindow.add(panel2, BorderLayout.EAST); 


     panel1.add(selectList); 
     selectList.add(scrollPane); 
     panel2.add(showList); 
     showList.add(scrollPane); 



    } 

    public void actionPerformed(ActionEvent e) 
    { 

    } 

    public static void main(String[] args) 
    { 
     new VowelCounterApp(); 
    } 

} 

回答

2

JList API會告訴你兩個關鍵的方法:

  1. public void setVisibleRowCount(int rowCount)
  2. public void setPrototypeCellValue(E prototype)

所以簡單地給列表一個足夠的行可見計數和足夠長的原型值,然後它的封閉JScrollPane的視口會自動調整其視口的大小。

例如:

import java.awt.GridLayout; 
import javax.swing.*; 

public class JListExample extends JPanel { 
    private JList<String> list1 = new JList<>(); 
    private JList<String> list2 = new JList<>(); 

    public JListExample() { 
     list1.setVisibleRowCount(20); 
     list2.setVisibleRowCount(20); 
     list1.setPrototypeCellValue(String.format("%60s", "")); 
     list2.setPrototypeCellValue(String.format("%60s", "")); 

     setLayout(new GridLayout(1, 2)); 
     add(new JScrollPane(list1)); 
     add(new JScrollPane(list2)); 
    } 

    private static void createAndShowGui() { 
     JListExample mainPanel = new JListExample(); 

     JFrame frame = new JFrame("JList Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

或者更好地避免「魔術」號:

public class JListExample extends JPanel { 
    private static final int LIST_ROW_COUNT = 20; 
    private static final int LIST_CHAR_WIDTH = 80; 
    private static final String LIST_PROTOTYPE = "%" + LIST_CHAR_WIDTH + "s"; 
    private JList<String> list1 = new JList<>(); 
    private JList<String> list2 = new JList<>(); 

    public JListExample() { 
     list1.setVisibleRowCount(LIST_ROW_COUNT); 
     list2.setVisibleRowCount(LIST_ROW_COUNT); 
     list1.setPrototypeCellValue(String.format(LIST_PROTOTYPE, "")); 
     list2.setPrototypeCellValue(String.format(LIST_PROTOTYPE, "")); 

在這裏,現在你可以更好地通過我的包裹他們和他們在一個JPanel JScrollPane中看到列出了使用的TitledBorder:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import javax.swing.*; 

public class JListExample extends JPanel { 
    private static final int LIST_ROW_COUNT = 20; 
    private static final int LIST_CHAR_WIDTH = 80; 
    private static final String LIST_PROTOTYPE = "%" + LIST_CHAR_WIDTH + "s"; 
    private JList<String> list1 = new JList<>(); 
    private JList<String> list2 = new JList<>(); 

    public JListExample() { 
     list1.setVisibleRowCount(LIST_ROW_COUNT); 
     list2.setVisibleRowCount(LIST_ROW_COUNT); 
     list1.setPrototypeCellValue(String.format(LIST_PROTOTYPE, "")); 
     list2.setPrototypeCellValue(String.format(LIST_PROTOTYPE, "")); 

     setLayout(new GridLayout(1, 2)); 
     add(createListWrapper(list1, "JList 1")); 
     add(createListWrapper(list2, "JList 2")); 
    } 

    private JComponent createListWrapper(JList<String> list, String title) { 
     JScrollPane scrollPane = new JScrollPane(list); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

     JPanel wrapperPanel = new JPanel(new BorderLayout()); 
     wrapperPanel.add(scrollPane); 
     wrapperPanel.setBorder(BorderFactory.createTitledBorder(title)); 
     return wrapperPanel; 
    } 

    private static void createAndShowGui() { 
     JListExample mainPanel = new JListExample(); 

     JFrame frame = new JFrame("JList Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

編輯
正如評論MadProgrammer狀態:

我還小心prototypeCellValue,除非值數據的預期長度相匹配,它可以截斷你的數據時,它的顯示,只需要要小心

+0

所以我必須做兩個方法來顯示一個空的JList? – JavaFox

+0

@ user2476208:否。你必須簡單**調用**這兩種方法。 –

+1

@ user2476208:並且不要將JScrollPane添加到JList,這是相反的方式。你會想要閱讀JList教程。您對JScrollPane的使用是完全倒退的。看看它的教程 - 只需谷歌JList教程和JScrollPane教程,首先擊中兩個搜索。同時檢查API。作爲一般規則,我們希望在介紹問題之前先看過介紹教程和API,因爲這會消除最簡單的問題。 –

相關問題