Java 限制包含JList的JScrollpane的宽度
我在Java 限制包含JList的JScrollpane的宽度,java,swing,jlist,listcellrenderer,Java,Swing,Jlist,Listcellrenderer,我在JScrollPane中创建了一个JList,它使用一个自定义的ListCellRenderer。ListCellRenderer包含一个Jlabel,它用HTML包装其内容,以便文本自动包装。在不使用JScrollPane的情况下,包装可以工作,但是当我使用JScrollPane时,文本不会被包装,并且会出现一个水平滚动条 我的ListCellRenderer摘录: public class WorkableCellRenderer implements ListCellRenderer&
JScrollPane
中创建了一个JList
,它使用一个自定义的ListCellRenderer
。ListCellRenderer
包含一个Jlabel
,它用HTML包装其内容,以便文本自动包装。在不使用JScrollPane
的情况下,包装可以工作,但是当我使用JScrollPane
时,文本不会被包装,并且会出现一个水平滚动条
我的ListCellRenderer
摘录:
public class WorkableCellRenderer implements ListCellRenderer<Workable> {
@Override
public final Component getListCellRendererComponent(final JList<? extends Workable> list, final Workable value,
final int index, final boolean isSelected, final boolean isFocused) {
JPanel cell = new JPanel();
cell.setLayout(new BoxLayout(cell, BoxLayout.Y_AXIS));
// ...
JPanel pnlDescription = new JPanel();
cell.add(pnlDescription);
pnlDescription.setLayout(new BorderLayout());
JLabel lblDescription =
new JLabel("<html><p style=\"margin: 0; padding: 0;\">" + value.getDescription() + "</p></html>");
lblDescription.setFont(lblDescription.getFont().deriveFont(Font.PLAIN));
pnlDescription.add(lblDescription, BorderLayout.CENTER);
// ...
return cell;
}
}
我认为问题在于JScrollPane
的视口,因为它比JScrollPane
本身大。如何调整视口宽度,使其始终与JScrollPane
的宽度相同
下面是一个MCVE,它显示了我的问题:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.border.EmptyBorder;
public class TestFrame extends JFrame {
private static final long serialVersionUID = -5281126214046039839L;
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
final TestFrame frame = new TestFrame();
frame.setVisible(true);
} catch (final Exception e) {
e.printStackTrace();
}
}
});
}
public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 500);
getContentPane().setLayout(new BorderLayout());
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(mainPanel);
final DefaultListModel<String> lm = new DefaultListModel<>();
final JList<String> list = new JList<>(lm);
list.setCellRenderer(new MyListCellRenderer());
final JScrollPane scrollPane = new JScrollPane(list);
mainPanel.add(scrollPane);
for (int i = 1; i < 21; i++) {
lm.addElement(String.valueOf(i));
}
}
private class MyListCellRenderer implements ListCellRenderer<String> {
private final JPanel panel = new JPanel();
private final JLabel label = new JLabel();
public MyListCellRenderer() {
panel.setLayout(new BorderLayout());
panel.setBackground(new Color(16777215));
panel.add(label);
}
@Override
public Component getListCellRendererComponent(final JList<? extends String> list, final String val,
final int index, final boolean isSelected, final boolean hasFocus) {
label.setText("<html><p>Item number " + val
+ " contains some very long text, that ideally should wrap.</p></html>");
if (isSelected) {
panel.setBackground(new Color(5323));
} else {
panel.setBackground(new Color(16777215));
}
return panel;
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.EventQueue;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.ListCellRenderer;
导入javax.swing.border.EmptyBorder;
公共类TestFrame扩展了JFrame{
私有静态最终长serialVersionUID=-5281126214046039839L;
公共静态void main(最终字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
最终测试框架=新测试框架();
frame.setVisible(true);
}捕获(最终异常e){
e、 printStackTrace();
}
}
});
}
公共测试框架(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置大小(200500);
getContentPane().setLayout(新的BorderLayout());
最终JPanel主面板=新JPanel();
setLayout(新的BorderLayout());
主面板设置命令(新的清空命令(5,5,5,5));
getContentPane().add(主面板);
最终DefaultListModel lm=新DefaultListModel();
最终JList列表=新JList(lm);
setCellRenderer(新的MyListCellRenderer());
最终JScrollPane滚动窗格=新JScrollPane(列表);
主面板。添加(滚动窗格);
对于(int i=1;i<21;i++){
lm.addElement(String.valueOf(i));
}
}
私有类MyListCellRenderer实现ListCellRenderer{
私有最终JPanel面板=新JPanel();
专用最终JLabel标签=新JLabel();
公共MyListCellRenderer(){
panel.setLayout(新的BorderLayout());
面板.立根背景(新颜色(16777215));
面板。添加(标签);
}
@凌驾
公共组件GetListCellRenderComponent(最终JList一切取决于…,然后JScrollPane
中的JList
可以为使用的LayoutManager
返回适当的getPreferredSize
(或直接使用)
getPreferredSize
返回ListCellRenderer
的值是多少,这PreferredSize
对于所有项目是否相同
你打算怎么做
是否对可见行使用了限制
一切都取决于…,然后JScrollPane
中的JList
可以为已使用的LayoutManager
返回正确的getPreferredSize
(或直接使用)
getPreferredSize
返回ListCellRenderer
的值是多少,这PreferredSize
对于所有项目是否相同
你打算怎么做
是否对可见行使用了限制
一切都取决于…,然后JScrollPane
中的JList
可以为已使用的LayoutManager
返回正确的getPreferredSize
(或直接使用)
getPreferredSize
返回ListCellRenderer
的值是多少,这PreferredSize
对于所有项目是否相同
你打算怎么做
是否对可见行使用了限制
一切都取决于…,然后JScrollPane
中的JList
可以为已使用的LayoutManager
返回正确的getPreferredSize
(或直接使用)
getPreferredSize
返回ListCellRenderer
的值是多少,这PreferredSize
对于所有项目是否相同
你打算怎么做
是否对可见行使用了限制
认为问题在于JScrollPane的视口,因为它比JScrollPane本身大。如何调整视口的宽度,使其始终与JScrollPane的宽度相同
您需要在面板上实现可滚动
界面,以将面板的宽度限制为滚动窗格的宽度
或者您可以使用,它提供了一些方法,允许您控制这种行为
认为问题在于JScrollPane的视口,因为它比JScrollPane本身大。如何调整视口的宽度,使其始终与JScrollPane的宽度相同
您需要在面板上实现可滚动
界面,以将面板的宽度限制为滚动窗格的宽度
或者您可以使用,它提供了一些方法,允许您控制这种行为
认为问题在于JScrollPane的视口,因为它比JScrollPane本身大。如何调整视口的宽度,使其始终与JScrollPane的宽度相同
您需要在面板上实现可滚动
界面,以将面板的宽度限制为滚动窗格的宽度
或者您可以使用提供
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.border.EmptyBorder;
public class TestFrame extends JFrame {
private static final long serialVersionUID = -5281126214046039839L;
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
final TestFrame frame = new TestFrame();
frame.setVisible(true);
} catch (final Exception e) {
e.printStackTrace();
}
}
});
}
public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 500);
getContentPane().setLayout(new BorderLayout());
final JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(mainPanel);
final DefaultListModel<String> lm = new DefaultListModel<>();
final JList<String> list = new JList<>(lm);
list.setCellRenderer(new MyListCellRenderer());
final JScrollPane scrollPane = new JScrollPane(list);
mainPanel.add(scrollPane);
for (int i = 1; i < 21; i++) {
lm.addElement(String.valueOf(i));
}
}
private class MyListCellRenderer implements ListCellRenderer<String> {
private final JPanel panel = new JPanel();
private final JLabel label = new JLabel();
public MyListCellRenderer() {
panel.setLayout(new BorderLayout());
panel.setBackground(new Color(16777215));
panel.add(label);
}
@Override
public Component getListCellRendererComponent(final JList<? extends String> list, final String val,
final int index, final boolean isSelected, final boolean hasFocus) {
label.setText("<html><p>Item number " + val
+ " contains some very long text, that ideally should wrap.</p></html>");
if (isSelected) {
panel.setBackground(new Color(5323));
} else {
panel.setBackground(new Color(16777215));
}
return panel;
}
}
}