【问题标题】:How to make a multiline cell in Jtable如何在 Jtable 中制作多行单元格
【发布时间】:2015-12-22 20:57:52
【问题描述】:

我想知道是否有办法使用 Java Swing 在表中执行此操作。

我正在使用Vector<Vector<String>> 处理表,用于在 DefaultTableModel 对象中传递每列数据,但为此我不知道我必须使用什么。

注意:表格数据是在运行时动态添加的。

【问题讨论】:

  • 看看this,参见表格部分。现在请注意,这是相当旧的,并且表 API 已更改,因此其中一些可能无法正常工作或可能需要进行一些修改才能正常工作
  • 也可以考虑TablePopupEditor

标签: java swing jtable row rows


【解决方案1】:

您必须使用自定义的TabelCellRendererJList 视图。以下代码应该可以工作。

public class VectorTableCellRenderer extends JList<String> implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (value instanceof Vector) {
            setListData((Vector) value);
        }

        if (isSelected) {
            setBackground(UIManager.getColor("Table.selectionBackground"));
        } else {
            setBackground(UIManager.getColor("Table.background"));
        }

        return this;
    }
}

编辑:如何使用 VectorTableCellRenderer

    VectorTableCellRenderer renderer = new VectorTableCellRenderer();

    //set TableCellRenderer into a specified JTable column class
    table.setDefaultRenderer(Vector.class, renderer);

    //or, set TableCellRenderer into a specified JTable column
    table.getColumnModel().getColumn(columnIndex).setCellRenderer(renderer);

这是我测试的输出。

【讨论】:

  • 谢谢!但是很抱歉我的无知,但是我该如何使用它呢?我已经将它添加到我的代码中,但我不知道如何“激活”它。谢谢!
  • 谢谢,为不同的行添加不同的项目?我让它工作了,但每一行都有相同的项目。我想做类似你的例子。对不起,如果这是微不足道的,我很菜鸟。谢谢!
  • 是的,只是等待我最后一个问题的答案将其标记为已接受的答案。谢谢。
【解决方案2】:
javax.swing.JTable jTableReport = new javax.swing.JTable();// new JTable
javax.swing.table.DefaultTableModel TableModel = new javax.swing.table.DefaultTableModel(ArrayListTable.size(),Header.length);//new TableModel
//Now you must be add your data inside TableModel
    jTableReport.setModel(TableModel);//setModel inside JTable

int RowWidth = 90;//Width You want to be
int RowHight = 25;//Hight of one line

for (int C = 0; C < jTableReport.getColumnCount(); C++) {
    for (int R = 0; R < jTableReport.getRowCount(); R++) {
        Object RowValue = jTableReport.getValueAt(R, C);
        int lengthRow = String.valueOf(RowValue).length();
        if (lengthRow>RowWidth) {
            int NumLines = lengthRow/RowWidth;
                    if (NumLines == 1) {
                        NumLines = 2;
                    }
            int begainIndex = 0;
            int endIndex = RowWidth;
            String NewRowValue = String.valueOf(RowValue);
            for (int i = 1; i < NumLines; i++) {
                if (i==1) {
                    NewRowValue = "<html>"+(String.valueOf(RowValue).substring(begainIndex, endIndex))+"<br>";
                }else if (i == NumLines) {
                    NewRowValue = NewRowValue + (String.valueOf(RowValue).substring(begainIndex, endIndex))+"</html>";
                }else {
                    NewRowValue = NewRowValue + (String.valueOf(RowValue).substring(begainIndex, endIndex))+"<br>";
                }

                begainIndex = begainIndex + RowWidth;
                endIndex = endIndex + RowWidth;
                i++;
            }
            jTableReport.setValueAt(NewRowValue, R, C);
            jTableReport.setRowHeight(R, NumLines*RowHight);
        }
    }
}

【讨论】:

  • 不鼓励只回答代码。请为您的解决方案添加一些评论。
【解决方案3】:
public void resizeCellWidthAndHieght(JTable table, int HorizontalAlignment, int VerticalAlignment) {
    DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
        defaultTableCellRenderer.setHorizontalAlignment(HorizontalAlignment);
        defaultTableCellRenderer.setVerticalAlignment(VerticalAlignment);
    table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
    final TableColumnModel columnmodel = table.getColumnModel();
    int HieghtArray[] = new int[table.getRowCount()] ;
    for (int column = 0; column < table.getColumnCount(); column++) {
        table.getColumnModel().getColumn(column).setCellRenderer(defaultTableCellRenderer);
        int width = 15; // Min width
        int height = 25; // Min width
        for (int row = 0; row < table.getRowCount(); row++) {
            TableCellRenderer renderer = table.getCellRenderer(row, column);
            Component comp = table.prepareRenderer(renderer, row, column);
            width = Math.max(comp.getPreferredSize().width +1 , width);
            height = Math.max(comp.getPreferredSize().height +4 , HieghtArray[row]);
            if (HieghtArray[row]< height) {
                HieghtArray[row] = height;
            }

        }
        if(width > 300)
            width=300;
        columnmodel.getColumn(column).setPreferredWidth(width);
    }
    for (int i = 0; i < table.getRowCount(); i++) {
        try {
            table.setRowHeight(i, HieghtArray[i]);
        } catch (Exception e) { }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2017-09-07
    • 2013-06-14
    • 2013-06-30
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多