我有一个有3列的JTable.我已经设置了TableCellRenderer
所有3列这样的(可能不是很有效?).
for (int i = 0; i < 3; i++) {
myJTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
Run Code Online (Sandbox Code Playgroud)
将getTableCellRendererComponent()
返回一个随机的背景颜色为每行一个组件.
在程序运行时如何将背景更改为其他随机颜色?
我有一个带有自定义单元格渲染器的JTable.该单元格是一个包含JTextField和JButton的JPanel.JTextField包含一个整数,当用户单击JButton时,应该增加整数.
问题是当我在JTable单元格中使用它时,无法单击JButton.如何使其可点击?
这是我的测试代码:
public class ActiveTable extends JFrame {
public ActiveTable() {
RecordModel model = new RecordModel();
model.addRecord(new Record());
JTable table = new JTable(model);
EditorAndRenderer editorAndRenderer = new EditorAndRenderer();
table.setDefaultRenderer(Object.class, editorAndRenderer);
table.setDefaultEditor(Object.class, editorAndRenderer);
table.setRowHeight(38);
add(new JScrollPane(table));
setPreferredSize(new Dimension(600, 400));
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Active Table");
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ActiveTable();
}
});
}
class RecordModel extends AbstractTableModel {
private final List<Record> records = new ArrayList<Record>();
@Override
public int getColumnCount() …
Run Code Online (Sandbox Code Playgroud) 甚至我也阅读并测试了@kleopatra的答案
关于super.getTableCellRendererComponent(...)
必须在返回之前的最后一行代码行,我无法通过这些建议编写正确的渲染器,因为我只能这样工作
JLabel
是为Borders,HorizontalAlignment和Foreground添加的,特别是Background通过使用Component而不是JLabel
(在这里不太重要)引起了一些非句子
来自SSCCE
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class SelectedTableHeader {
private JFrame frame = new JFrame("Table Demo");
private JTableHeader header;
private Object selectedColumn = null;
private String[] columnNames = {"String", "Integer", "Float", "Double", "Locale & Double", "Boolean"};
private Object[][] data = {
{"aaa", new Integer(12), new Float(12.15), new Double(100.05), new Double(12.05), true},
{"bbb", new Integer(5), new Float(7.154), new Double(6.1555), new Double(417.55), false},
{"CCC", new Integer(92), …
Run Code Online (Sandbox Code Playgroud) 我搜索了很多并得到了这个Q的答案.但是他们中的许多人都提到了404错误的链接.我想像这样制作表格:
java中有没有这方面的方法?
首先,抱歉发布一些可能有点过于具体的内容,但我对Swing不是很有经验,似乎无法找到符合我需求的好例子.
所以我试图找出实现动态GUI的最佳方法,以便在Swing中选择过滤条件:
底层模型是一个类,其中包含可以否定的标准列表(即应用NOT前缀),以及指示这些标准是否应与AND或OR组合的属性.
GUI将允许用户添加,更改或删除标准,并选择组合运算符(和/或).第一个标准自然没有组合选择器,第三个和后续标准将简单地使用与第二个标准相同的组合运算符.
右侧的X按钮将用于删除标准.按下"添加"按钮后,将在底部添加一个新的组件行.随着更改,这些将反映在基础模型中.
当然,我可以通过简单地将组件添加到JPanel然后相应地更新模型来实现"原始",但我更喜欢更简洁的解决方案,例如TableModel提供的解决方案.
所以我想知道一个带有自定义TableModel和TableCellRenderer/Editor的表是否是最好的方法,或者是否有更好的方法来实现这样的东西.如果table确实是最好的方法,我会很感激指出如何使用TableCellRenderers或-Editors来实现这一目标.
提前致谢.
可以正确地根据外部的值刷新背景,而不必强制重绘 table.repaint();
对Java6/7有效,因为API没有任何变化
我的SSCCE工作正常,重新粉刷 JTable.repaint()
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class MyTableAndRenderer {
private JFrame frame = new JFrame();
private JPanel panel = new JPanel();
private String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"};
private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(items);
private JComboBox combo = new JComboBox(comboBoxModel);
private JPanel panel1 …
Run Code Online (Sandbox Code Playgroud) 我有一个自定义单元格渲染器,用于单元格进行自动换行,以便可以读取更多内容.这是代码:
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;
public class TextWrapCellRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID = 1L;
public TextWrapCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
setMargin(new Insets(0, 5, 0, 5));
setSelectionColor(Color.GREEN);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setText((String)value);
setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
setSelectionColor(Color.GREEN);
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:正确使用单元格渲染器,但是当用户在JTable中选择一行时,它仅显示非自定义渲染单元格的突出显示.突出显示该行的所有其他单元格.这只留下一个带有白色背景的单元格,而行的其余部分则为蓝色(在我的情况下)作为突出显示的背景颜色.
我创建了一个带有自定义表格渲染和自定义单元格编辑器的JTable,它可以在图像中显示结果
我使用扩展JPanel的单独类创建了第一个表格单元格中显示的面板.并将表值添加为,
tbl.setCellEditor(new customCell());
tbl.getColumnModel().getColumn(0).setCellRenderer(new customCell());
DefaultTableModel dtm = (DefaultTableModel) tbl.getModel();
Vector v = new Vector();
v.add(new Panel());
v.add("Test");
dtm.addRow(v);
v.clear();
v.add(new Panel());
v.add("Test 2");
dtm.addRow(v);
Run Code Online (Sandbox Code Playgroud)
这是我的表自定义类来创建这个表,
class customCell extends DefaultTableModel implements TableCellRenderer, TableCellEditor {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Panel p = new Panel();
table.setRowHeight(row, p.getHeight());
return p;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return new Panel();
}
public Object getCellEditorValue() …
Run Code Online (Sandbox Code Playgroud) 我一直在使用传统的Java TableCellRenderer
方法scala.swing.Table
在我在桌面上声明我的渲染器的地方提供渲染器TableColumnModel
.这个代码看起来像:
val myTable = new Table {
lazy val tcm = initColumnModel
peer.setColumnModel(tcm)
override
protected def rendererComponent(sel: Boolean, foc: Boolean, row: Int, col: Int) = {
//GET THE VALUE FROM THE TableModel
val value = model.getValueAt(
peer.convertRowIndexToModel(row),
peer.convertColumnIndexToModel(col))
//GET THE RENDERER FROM THE ColumnModel
val renderer = tcm.getColumn(col).getCellRenderer
//WRAP IN A COMPONENT
Component.wrap(renderer.getTableCellRendererComponent(
peer,
value,
sel,
foc,
row,
col).asInstanceOf[JComponent])
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎有内存泄漏 - 大概是因为我正在为表中的每个单元创建一个新的Component实例(大约30k行).当然,当我用一个JTable
(使用完全相同的列和数据模型)替换我的scala表时,我的内存泄漏就消失了.
因此,我的问题是,当重写rendererComponent
方法时人们使用什么样的代码,假设一个人拥有自己的单元格渲染器?
我正在关注我发现的一些代码,(是的,我理解它是如何工作的)它来自这里:Code Link
如果单元格值设置为"黄色",我正在尝试设置单元格前景色
这是我的代码:
public class Board extends JPanel{
private static final long serialVersionUID = 1L;
int boardHeight = 20;
int boardWidth = 10;
JTable table;
public Board() {
table = new JTable(this.boardHeight, this.boardWidth);
table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
table.setFocusable(false);
table.setShowGrid(false);
table.setRowMargin(0);
table.setIntercellSpacing(new Dimension(0,0));
table.setRowSelectionAllowed(false);
table.setVisible(true);
this.add(table);
this.setPreferredSize(new Dimension(table.getPreferredSize().width, (table.getPreferredSize().height + 85)));
}
public void paint(Graphics g) {
table.setRowHeight(20);
for (int x = 0; x < this.table.getColumnCount(); ++x) {
TableColumn col = this.table.getColumnModel().getColumn(x);
col.setPreferredWidth(20);
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有Cell Renderer
public class …
Run Code Online (Sandbox Code Playgroud)