Expand JList row height depending on content

后端 未结 3 1352
长情又很酷
长情又很酷 2020-12-21 05:48

I have a simple problem which totally drives me crazy.

I have a JList, and would like its cells to expand depending on their content, which is text of variable lengt

相关标签:
3条回答
  • 2020-12-21 05:55

    Not sure if there is an elegant way. One way that I know works is as follows : In getListCellRendererComponent()

    • Use JLabel for the renderer
    • Convert the text in question to HTML and use some logic to insert <br> in to the text where desired.
    • Then set the text as text for the JLabel component and return.
    0 讨论(0)
  • 2020-12-21 06:12

    there are maybe easiest and nicest way, I think that JTable with one TableColumn (and without TableHeader)in all cases better as JList, here is your Render MacOX version

    then output should be

    enter image description here

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import javax.swing.text.*;
    //http://tips4java.wordpress.com/2008/10/26/text-utilities/
    public class AutoWrapTest {
    
        public JComponent makeUI() {
            String[] columnNames = {" Text Area Cell Renderer "};
            Object[][] data = {
                {"123456789012345678901234567890"},
                {"ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdx"},
                {"----------------------------------------------0"},
                {">>>>>>>>>>>>>ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffffffd"
                    + "ffffdffffddxffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdd"
                    + "ffffdffffdffffffffdx>>>>>>>>>>>>>>>>>>>>>>>>>|"},
                {">>>>>>>>>>>>ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffd"
                    + "ffffdffffdx>>>>>>>>>>>>>>>>>>>>>>>>>>|"},
                {"a|"},
                {">>>>>>>>bbbb>>>>>>>>>>>>>>>>>>>|"},
                {">>>>>>>>>>>>>>>>>>|"},
                {">>>>>>>>>>>>>ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffffffd"
                    + "ffffdffffddxffffdffffdffffdffffffffd123456789012345678901234567890ffffdffffd"
                    + "ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffddx>>>>>>>>>>>>>>>>>>>>"
                    + ">>>>>|"},
                {">>>>>>>>>>>>>ffffdffffdffffdffffffffd123456789012345678901234567890ffffdffffd"
                    + "ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffddxffffdffffdffffdffffffffd123456"
                    + "789012345678901234567890ffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdffffdd"
                    + "ffffffffd123456789012345678901234567890ffffddx>>>>>>>>>>>>>>>>>>"
                    + ">>>>>>>|"},};
            TableModel model = new DefaultTableModel(data, columnNames) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public boolean isCellEditable(int row, int column) {
                    return false;
                }
            };
            JTable table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void doLayout() {
                    TableColumn col = getColumnModel().getColumn(0);
                    for (int row = 0; row < getRowCount(); row++) {
                        Component c = prepareRenderer(col.getCellRenderer(), row, 0);
                        if (c instanceof JTextArea) {
                            JTextArea a = (JTextArea) c;
                            int h = getPreferredHeight(a) + getIntercellSpacing().height;
                            if (getRowHeight(row) != h) {
                                setRowHeight(row, h);
                            }
                        }
                    }
                    super.doLayout();
                }
    
                private int getPreferredHeight(JTextComponent c) {
                    Insets insets = c.getInsets();
                    View view = c.getUI().getRootView(c).getView(0);
                    int preferredHeight = (int) view.getPreferredSpan(View.Y_AXIS);
                    return preferredHeight + insets.top + insets.bottom;
                }
            };
            table.setEnabled(false);
            table.setShowGrid(false);
            table.setTableHeader(null);
            table.getColumnModel().getColumn(0).setCellRenderer(new TextAreaCellRenderer());
            //table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane sp = new JScrollPane(table);
            sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
            sp.setPreferredSize(new Dimension(250, 533));
            JPanel p = new JPanel(new BorderLayout());
            p.add(sp);
            return p;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    
        public static void createAndShowGUI() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            f.getContentPane().add(new AutoWrapTest().makeUI());
            f.setLocation(100, 100);
            f.pack();
            f.setVisible(true);
        }
    }
    
    class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {
    
        private static final long serialVersionUID = 1L;
        private final Color evenColor = new Color(230, 240, 255);
    
        public TextAreaCellRenderer() {
            super();
            setLineWrap(true);
            setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
                setBackground((row % 2 == 0) ? evenColor : getBackground());
            }
            setFont(table.getFont());
            setText((value == null) ? "" : value.toString());
            return this;
        }
    }
    
    0 讨论(0)
  • 2020-12-21 06:13

    Try using JList's setFixedCellHeight() method.

    0 讨论(0)
提交回复
热议问题