繁体   English   中英

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

[英]How to display multiple lines in a JTable Cell

我想创建一个如下图所示的JTable 在此输入图像描述

将使用哪个java类,可能如何使用?

Multiline JTable单元可以轻松使用自定义的TableCellRenderer 使用以下步骤创建TableCellRenderer

第1步:创建TableCellRenderer

下面的代码显示为String[]值创建多行TableCellRenderer 可以将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);

这是我测试的截图:

多行TableCellRenderer测试

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

  • JTable有一个没有TableHeader TableColumn

  • 带有JLabelsJTextFields JPanelGridBagLayout

  • JList

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

您还将设置表格行高, 如上面的评论中所述

Oracle官方文档澄清了这一点。

jTable1.setShowGrid(true);

试试这个代码:)

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

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

在大多数情况下,为所有字符串激活此渲染器将执行您想要的操作:

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

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

/** Variant of DefaultTableCellRenderer that automatically switches
 *  to multi-line HTML when the value contains newlines. */
class MultiLineCellRenderer extends DefaultTableCellRenderer
{
  @Override public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row, int column)
  { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    int height = c.getPreferredSize().height;
    if (table.getRowHeight(row) < height)
      table.setRowHeight(row, height);
    return c;
  }

  @Override protected void setValue(Object value)
  { if (value instanceof String)
    { String sVal = (String)value;
      if (sVal.indexOf('\n') >= 0 && // any newline?
        !(sVal.startsWith("<html>") && sVal.endsWith("</html>"))) // already HTML?
        value = "<html><nobr>" + htmlEncodeLines(sVal) + "</nobr></html>";
    }
    super.setValue(value);
  }

  /** Encode string as HTML. Convert newlines to &lt;br&gt; as well.
   * @param s String to encode.
   * @return Encoded string. */
  protected static String htmlEncodeLines(String s)
  { int i = indexOfAny(s, "<>&\n", 0); // find first char to encode
    if (i < 0)
      return s; // none
    StringBuffer sb = new StringBuffer(s.length() + 20);
    int j = 0;
    do
    { sb.append(s, j, i).append(htmlEncode(s.charAt(i)));
      i = indexOfAny(s, "<>&\n", j = i + 1);
    } while (i >= 0);
    sb.append(s, j, s.length());
    return sb.toString();
  }

  private static String htmlEncode(char c)
  { switch (c) {
    case '<': return "&lt;";
    case '>': return "&gt;";
    case '&': return "&amp;";
    case '\n': return "<br>";
    default: return Character.toString(c);
  } }

  private static int indexOfAny(String s, String set, int start)
  { for (int i = start; i < s.length(); ++i)
    if (set.indexOf(s.charAt(i)) >= 0)
      return i;
    return -1;
  }
}

当任何表具有大量数据时,在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);
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM