[英]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);
这是我测试的截图:
基本上你可以把任何类型的JComponents
放到JTable
单元格,取决于if是否内容可编辑,那就是跟我说的关注
JTable
有一个没有TableHeader
TableColumn
带有JLabels
或JTextFields
JPanel
( GridBagLayout
)
JList
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 <br> 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 "<";
case '>': return ">";
case '&': return "&";
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.