JScrollPane的搞乱大小
问题描述:
我想JScrollPane中添加一个JList,但它搅乱了,当我做到这一点,如图中的图片大小:JScrollPane的搞乱大小
如果该列表是空的它会像右边的那个一样大,但是如果我添加了一些东西,它会缩小到右边的那个大小,设置最大尺寸或优选尺寸对它没有影响。
这很烦人,我希望它总是看起来像左边那个,不管它是否为空。这里是我正在使用的代码,但要做到项目的复杂性,很难提供一个工作示例。
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());
}
}
好,我试图setVisibleRowCount(INT rowCount时)和它没有影响的宽度,但是然后我没有setPrototypeCellValue(T值)和i只是从中.setPrototypeCellValue的javadoc使用的值( “Index 1234567890”);它的工作,但“索引1234567890”究竟是什么意思,这个函数是如何工作的? – Joking313
@EricNawrocki:我不确定为什么你会认为setVisibleRowCount会设置宽度,只是方法的名称本身告诉你它的确实用途,对吧?至于“索引1234567890”的含义。这不代表任何意思*。这只是一个无意义的字符串,它告诉JList它应该足够宽以显示该尺寸的字符串。它还设置每一行的高度 - 但是然后JList API告诉你所有这些。请尽量让它成为探索API的习惯,因为这样做会释放你。 –