有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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;
}

共 (1) 个答案

  1. # 1 楼答案

    您似乎没有调用JList对象上最重要的方法来正确调整JScrollPane视口的大小:setVisibleRowCount(int rowCount)setPrototypeCellValue(T value)。第一种方法帮助JList告诉JScrollPane它的垂直视口大小,第二种方法帮助JList告诉它的控股JScrollPane它的首选水平视口大小

    有关详细信息,请查看JList API

    例如

    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());
        }
    }