JScrollPane的搞乱大小

问题描述:

我想JScrollPane中添加一个JList,但它搅乱了,当我做到这一点,如图中的图片大小:JScrollPane的搞乱大小

http://imgur.com/a/OtFfd

如果该列表是空的它会像右边的那个一样大,但是如果我添加了一些东西,它会缩小到右边的那个大小,设置最大尺寸或优选尺寸对它没有影响。

这很烦人,我希望它总是看起来像左边那个,不管它是否为空。这里是我正在使用的代码,但要做到项目的复杂性,很难提供一个工作示例。

private JPanel setUpRight(){ 
    //right.setLayout(new BoxLayout(right,BoxLayout.PAGE_AXIS)); 
    right.setBorder(BorderFactory.createEmptyBorder(
      2, //top 
      10,  //left 
      2, //bottom 
      10)); //right 
    JPanel localCenter = new JPanel(new BorderLayout()); 
    JPanel localBottom = new JPanel(new BorderLayout()); 
    saves.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    saves.setLayoutOrientation(JList.VERTICAL); 
    saves.setDragEnabled(true); 
    saves.setTransferHandler(new FromTransferHandler()); 
    JScrollPane scroll = new JScrollPane(saves,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 


    configs.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    configs.setLayoutOrientation(JList.VERTICAL); 
    configs.setDragEnabled(true); 
    configs.setTransferHandler(new FromTransferHandler1()); 
    JScrollPane scroll1 = new JScrollPane(configs,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
    localCenter.add(new JLabel("List of saved macros"),BorderLayout.NORTH); 
    localCenter.add(scroll,BorderLayout.CENTER); 
    localCenter.add(new JButton("Delete"),BorderLayout.SOUTH); 
    localBottom.add(new JLabel("List of saved configs"),BorderLayout.NORTH); 
    localBottom.add(scroll1,BorderLayout.CENTER); 
    right.add(localCenter); 

    right.add(Box.createRigidArea(new Dimension(left.getHeight(), 10))); 
    JSeparator separate = new JSeparator(SwingConstants.HORIZONTAL); 
    Dimension d = separate.getPreferredSize(); 
    d.width = separate.getMaximumSize().width; 
    separate.setMaximumSize(d); 

    right.add(separate,BoxLayout.LINE_AXIS); 
    right.add(Box.createRigidArea(new Dimension(left.getHeight(), 10))); 

    right.add(localBottom); 
    return right; 
} 

您似乎没有被调用你的JList对象的最重要的方法让他们正确尺寸JScrollPane的视口:setVisibleRowCount(int rowCount)setPrototypeCellValue(T value)。有助于JList告诉JScrollPane其垂直视口大小,第二种方法可帮助JList告知其持有的JScrollPane首选水平视口大小。

请检查了解详情。

例如,

import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

public class JListExample extends JPanel { 
    public JListExample() { 
     String[] listData = { "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five", "One", "Two", "Three", "Four", "Five", "One", "Two", "Three", 
       "Four", "Five" }; 
     JList<String> myList = new JList<>(listData); 

     myList.setVisibleRowCount(10); 
     myList.setPrototypeCellValue("abcdefghijklm"); 
     JScrollPane scrollPane = new JScrollPane(myList); 
     add(scrollPane); 

    } 

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

     JFrame frame = new JFrame("E.G."); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

好,我试图setVisibleRowCount(INT rowCount时)和它没有影响的宽度,但是然后我没有setPrototypeCellValue(T值)和i只是从中.setPrototypeCellValue的javadoc使用的值( “Index 1234567890”);它的工作,但“索引1234567890”究竟是什么意思,这个函数是如何工作的? – Joking313

+0

@EricNawrocki:我不确定为什么你会认为setVisibleRowCount会设置宽度,只是方法的名称本身告诉你它的确实用途,对吧?至于“索引1234567890”的含义。这不代表任何意思*。这只是一个无意义的字符串,它告诉JList它应该足够宽以显示该尺寸的字符串。它还设置每一行的高度 - 但是然后JList API告诉你所有这些。请尽量让它成为探索API的习惯,因为这样做会释放你。 –