如何在JTable单元格中显示多行

时间:2012-03-31 11:47:47

标签: java swing jtable

我想创建一个JTable,如下图:enter image description here

将使用哪个java课程以及可能的方法?

7 个答案:

答案 0 :(得分:12)

多行JTable单元格可以轻松使用自定义TableCellRenderer。使用以下步骤创建TableCellRenderer

第1步:创建TableCellRenderer

以下代码显示为TableCellRenderer值创建多行String[]。可以将String[]更改为Vector或其他Collection类型

public class MultiLineTableCellRenderer extends JList<String> implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        //make multi line where the cell value is String[]
        if (value instanceof String[]) {
            setListData((String[]) value);
        }

        //cell backgroud color when selected
        if (isSelected) {
            setBackground(UIManager.getColor("Table.selectionBackground"));
        } else {
            setBackground(UIManager.getColor("Table.background"));
        }

        return this;
    }
}

第2步:将TableCellRenderer设置为JTable

    MultiLineTableCellRenderer renderer = new MultiLineTableCellRenderer();

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

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

这是我测试的屏幕截图:

Multi-line TableCellRenderer Test

答案 1 :(得分:5)

基本上你可以将任何类型的JComponents放到JTable单元格中,取决于if是否内容可编辑,那就是跟我说下面

  • JTable,其中一个TableColumn没有TableHeader

  • JPanelGridBagLayout)与JLabelsJTextFields

  • JList

答案 2 :(得分:1)

如果您使用DefaultTableModel,则无效。您必须为扩展AbstractTableModel的表使用自定义模型,并且必须覆盖方法getColumnClass()以及其他抽象方法。

您还可以设置表格行高as mentioned in a comment above

official documentation from Oracle澄清了这一点。

答案 3 :(得分:0)

jTable1.setShowGrid(true);

试试这段代码:)

答案 4 :(得分:0)

jTable1.setShowHorizontalLines(true); // only HorizontalLines
  jTable1.setShowVerticalLines(true); //  only VerticalLines
  jTable1.setShowGrid(true);          // show Horizontal and Vertical
  jTable1.setGridColor(Color.yellow); // change line color 

答案 5 :(得分:0)

除了Channa Jayamuni建议的基于TableCellRenderer的{​​{1}}之外,您还可以JList<String> 之上构建多行渲染器。诀窍是使用DefaultTableCellRenderer组件的HTML功能并相应地调整行高。这样可以保留默认渲染器的更多功能。

为所有字符串激活此渲染器将在大多数情况下满足您的要求:

JLabel

该解决方案可以在某种程度上处理自动行高。即如果用更少的行来更新内容,则不会降低表格行的高度。这是一项非常复杂的任务,因为它也取决于同一行中任何其他单元格的内容。

setDefaultRenderer(String.class, new MultiLineCellRenderer());

答案 6 :(得分:-2)

当任何表具有大量数据时,在JTable中应用滚动条。 JScrollPane为您提供了可滚动的工具来滚动滚动条,您将获得所有内容。使用JTable的简单示例:

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class ScrollableJTable{
public static void main(String[] args) {
new ScrollableJTable();
}
public ScrollableJTable(){
JFrame frame = new JFrame("Creating a Scrollable JTable!");
JPanel panel = new JPanel();
 String data[][] =
  {{"001","abc","xyz","wtwt","gwgw","tttr","rtrt"},
  {"002","rwtr","ttrt","rtttr","trt","rtrt","trtrd"},
  {"003","rtt","trt","trt","trrttr","trt","rtr"},
  {"004","trt","trtt","trtrt","rtrtt","trt","trrt"},
  {"001","rttr","trt","trt","trtr","trt","trttr"},
  ;
  JTable table = new JTable(data,col);
  JTableHeader header = table.getTableHeader();
  header.setBackground(Color.yellow);
  JScrollPane pane = new JScrollPane(table);
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  panel.add(pane);
  frame.add(panel);
  frame.setSize(500,150);
  frame.setUndecorated(true);
  frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  }
}

现在您可以根据您的要求修改此表