我正在尝试将多个JLists放在JPanel中,将JPanel放在JScrollPane中。问题是,当我将JScrollPane添加到等式中时,JList和外边框之间有一个空格,我如何摆脱这个边框,使其水平填充?
这是一个小示例代码,它使用JLabel而不是JList来演示此问题。
/ edit:它似乎是windows的东西,在Mac OS上运行良好。
import java.awt.*;
import javax.swing.*;
public class Test extends JFrame
{
public static void main(String[] args)
{
Test test = new Test();
}
public Test()
{
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setContentPane(contentPane);
this.setMinimumSize(new Dimension(400, 300));
JScrollPane sp = new JScrollPane(createLeftPane());
sp.setBorder(BorderFactory.createLineBorder(Color.yellow));
this.add(sp, BorderLayout.WEST);
LookAndFeel.installBorder(sp, "BorderFactory.createEmptyBorder()");
StackTraceElement[] st = Thread.currentThread().getStackTrace();
for(int i = 0; i < st.length; i++) {
System.out.println(st[i]);
}
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private JPanel createLeftPane()
{
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
JLabel label = new JLabel("TEST LABEL");
label.setBorder(BorderFactory.createLineBorder(Color.blue));
panel.add(label, c);
panel.setBorder(BorderFactory.createLineBorder(Color.red));
return panel;
}
}
这是截图(第一个没有滚动窗格)
堆栈追踪:
java.lang.Thread.getStackTrace(Thread.java:1479)
test.Test.<init>(Test.java:27)
test.Test.main(Test.java:10)
/ edit:经过一些试验和错误后,我发现当我向禁区添加c.weightx = 0.5时,它确实会水平填充,但是当scrollPane变得比它的内容更大时,它会让自己更宽,很奇怪。请参阅以下屏幕截图:
答案 0 :(得分:3)
问题不在于滚动窗格。这是因为您将标签添加到JPanel。默认情况下,面板使用FlowLayot,每个组件周围的垂直/水平间隙为5像素。
将FlowLayout更改为使用0间隙,或使用其他布局。也许是BoxLayout。
答案 1 :(得分:3)
component.setBorder(null)
删除已在组件上设置的任何边框
答案 2 :(得分:2)
当我在Mac上运行时,问题不会发生,所以显然它是Windows的东西。
除了background
,foreground
,font
和opaque
的预期用户界面默认设置外,BasicPanelUI
还会安装边框,com.apple.laf.AquaPanelUI
(显然)没有。
LookAndFeel.installBorder(p,"Panel.border");
您可以尝试将您的设置为null
。
答案 3 :(得分:1)
你的意思是这样吗???
import java.awt.*;
import java.io.File;
import javax.swing.*;
import javax.swing.filechooser.FileSystemView;
public class FilesInTheJList {
private static final int COLUMNS = 5;
private Dimension size;
public FilesInTheJList() {
final JList list = new JList(new File("C:\\").listFiles()) {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredScrollableViewportSize() {
if (size != null) {
return new Dimension(size);
}
return super.getPreferredScrollableViewportSize();
}
};
list.setFixedCellHeight(50);
list.setFixedCellWidth(150);
size = list.getPreferredScrollableViewportSize();
size.width *= COLUMNS;
list.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
list.setCellRenderer(new MyCellRenderer());
list.setVisibleRowCount(0);
list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
JFrame f = new JFrame("Files In the JList");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(list));
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
FilesInTheJList fITJL = new FilesInTheJList();
}
});
}
private static class MyCellRenderer extends JLabel implements ListCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof File) {
File file = (File) value;
setText(file.getName());
setIcon(FileSystemView.getFileSystemView().getSystemIcon(file));
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setPreferredSize(new Dimension(250, 25));
setEnabled(list.isEnabled());
setFont(list.getFont());
setOpaque(true);
}
return this;
}
}
}
similair但更好的方法是@trashgod here
答案 4 :(得分:0)
trashgod的解决方案为我工作
LookAndFeel.installBorder(scrollpane,BorderFactory.createEmptyBorder().toString());
答案 5 :(得分:0)
您也可以使用
删除JScrollPane
的边框
JScrollPane yourScrollPane = new JScrollPane();
yourScrollPane.setBorder(BorderFactory.createEmptyBorder());