Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制包含JList的JScrollpane的宽度_Java_Swing_Jlist_Listcellrenderer - Fatal编程技术网

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