2014-10-29 78 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