2014-10-29 146 views
0

我目前正在處理Java中基於Swing的桌面應用程序。下面我遇到了這個問題。在Swing中向JList添加滾動條

我一直在試圖添加滾動條到我的ListArea(JList類型),但我不能這樣做,儘管我有這麼多的東西,我打算。這裏是代碼片段..我在MainFrame中寫這段代碼擴展了JFrame。任何幫助,將不勝感激。謝謝...

super(title) 
Jpanel panel = new Panel() 
panel(add) 
panel.setlayout(null) 

final JList<String> listArea = new JList<String>(labels); 
    listArea.setBounds(50, 180, 700, 300); 
    listArea.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    listArea.setFont(new Font("Serif", Font.ITALIC, 14)); 
    listArea.setVisibleRowCount(-1); 
    JScrollPane listScroller = new JScrollPane(); 
    listScroller.setViewportView(listArea); 
    listArea.setLayoutOrientation(JList.VERTICAL); 
    panel.add(listArea); 
    panel.add(listScroller); 

回答

4

擺脫panel.add(listArea);,它從JScrollPane

避免使用null佈局取出listArea,像素完美的佈局是現代的UI設計中的錯覺。影響組件的個體大小的因素太多,其中沒有一個可以控制。 Swing旨在與佈局經理一起工作,放棄這些將導致無法結束的問題和問題,您將花費越來越多的時間來嘗試糾正。

JScrollPane(和JViewport)有自己的佈局例程,你不能控制。一旦將其傳遞給JScrollPane,設置JList的大小將不起作用。

更多細節

我不知道您的期望listArea.setVisibleRowCount(-1);做什麼見Why is it frowned upon to use a null layout in SWING?,但我建議反對。

與例如

A List

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.ListSelectionModel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestList { 

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

    public TestList() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JPanel panel = new JPanel(new BorderLayout()); 

       List<String> labels = new ArrayList<>(25); 
       for (int index = 0; index < 100; index++) { 
        labels.add("Item " + index); 
       } 

       final JList<String> listArea = new JList<String>(labels.toArray(new String[labels.size()])); 
       listArea.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
       listArea.setFont(new Font("Serif", Font.ITALIC, 14)); 
       JScrollPane listScroller = new JScrollPane(); 
       listScroller.setViewportView(listArea); 
       listArea.setLayoutOrientation(JList.VERTICAL); 
       panel.add(listScroller); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(panel); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

更新當我刪除panel.add(listArea),本質上列表不顯示了。除此之外,我可以使用什麼來代替panel.setLayout(null) 我制定我的項目的方式如下(其中之一): JLabel serverLabel = new JLabel(「ServerName」); \t \t serverLabel.setBounds(250,10,80,25); \t \t panel.add(serverLabel); \t \t final JTextField serverText = new JTextField(30); \t \t serverText.setBounds(340,10,160,25); \t \t panel.add(serverText); – 2014-10-29 02:11:52

+0

我欣賞它,如果你可以在那個代碼片段中做一個特別的細微的安排 – 2014-10-29 02:12:33

+0

那是因爲你正在使用'null'佈局... – MadProgrammer 2014-10-29 02:13:17