[英]JTable - how do i insert a new JLabel for each row in a specific column?
我已经在互联网上闲逛了大约5个小时,以调试该问题。 基本上,我找不到任何人试图为特定列中的每一行添加新的JLabel的地方。
功能说明:我得到一个文件URL,我选择了通常为xlsx或doc的postFix-我想在JLabel中与Excel或Doc Icon联合显示此后缀-.-,但是我当前的代码只是在一遍又一遍地使用相同的JLabel,因为它只设置一次CellRenderer并在所有行上使用它,尽管我为每次迭代在for循环中都设置了它-我的所有代码对于此功能都是正确的,直到仅渲染器被叫一次。
所以我的问题如下-如何为列中的每一行添加一个新的JLabel? -
我的代码如下。
我的TableCellRenderer:
public class JLabelRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = -166379583761969293L;
// private String fileExtension;
// private JLabel label;
private LogEntry log;
private JLabel label;
public JLabelRenderer(LogEntry log) {
label = new JLabel();
System.out.println("makeing a new JLabelRenderer");
this.log = log;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
label = (JLabel) super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, column);
System.out.println(log.getFileExtension());
if (log.getFileExtension().equalsIgnoreCase("xlsx")) {
label.setIcon((ImageIcon) Pictures.getXlsx());
label.setText(log.getFileExtension());
} else if (log.getFileExtension().equalsIgnoreCase("doc")) {
label.setIcon((ImageIcon) Pictures.getDoc());
label.setText(log.getFileExtension());
} else if (log.getFileExtension().equalsIgnoreCase("docx")) {
label.setIcon((ImageIcon) Pictures.getDoc());
label.setText(log.getFileExtension());
} else if (log.getFileExtension().equalsIgnoreCase("pdf")) {
label.setIcon((ImageIcon) Pictures.getPdf());
label.setText(log.getFileExtension());
}
value = label;
return label;
}
@Override
public void setHorizontalAlignment(int alignment) {
super.setHorizontalAlignment(alignment);
}
public void setLog(LogEntry log) {
this.log = log;
}
}
我在哪里制作模型:(我有很多代码将actionListeners添加到右键单击功能中,而没有什么,但这几乎不相关)
public void makeLogModel()
{
logModel = new DefaultTableModel();
//addCellEditorListener(this);
logModel.setColumnIdentifiers(new String[]{"Lavet Dato", "Lavet Af", "Beskrivelse", "Sidst Redigeret Dato", "Sidst Redigeret Af", "Fil Type"});
setAutoCreateRowSorter(true);//allows to sort through the information.
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
setModel(logModel);
}
神奇发生的地方(在搜索日志后更新日志表)
public void updateLogTable(ArrayList<LogEntry> entryList)
{
logModel.setRowCount(entryList.size());
for(int i = 0; i < logModel.getRowCount(); i++)
{
setRowHeight(i, 30);
}
int row = 0;
for(LogEntry log : entryList)
{
logModel.setValueAt(log.getCreateDate(), row, 0);
logModel.setValueAt(log.getMadeBy(), row, 1);
logModel.setValueAt(log.getDescription(), row, 2);
logModel.setValueAt(log.getLastEdited(), row, 3);
logModel.setValueAt(log.getLastEditedBy(), row, 4);
labelRenderer = new JLabelRenderer(log);
getColumn("Fil Type").setCellRenderer(labelRenderer);
logModel.setValueAt(new JLabel(), logRow, 5);
row++;
}
}
我已经阅读了有关组件和编辑器的Java文档-但是所有代码示例都不是针对JLabel的-可能是因为CellRenderer扩展了JLabel。
我一直都在嗅探这样的信息,即getTableCellRendererComponent()方法中的“值”参数是应该以某种方式动态设置的参数……任何手术都将非常昂贵,请随时提出任何问题。
谢谢
logModel.setValueAt(new JLabel(),logRow,5);
不要在模型中放置JLabel,任何JComponent,XxxTableModel仅用于嵌套Renderer或Editor的值,有关更多信息,请参见Oracle教程。如何使用表- 创建表模型
Renderer或Editor直观地代表了真正的JComponent,更多内容请参见Oracle教程如何使用表- 概念:Editors and Renderers
label.setIcon((ImageIcon)Pictures.getXlsx());
在DefaultTableCellRenderer
实现中似乎出现了您的问题。
您创建类似于JLabelRenderer(LogEntry log)
渲染器是因为,对于所有单元格,您都有一个LogEntry
实例,并且getTableCellRendererComponent()
log.getFileExtension()
getTableCellRendererComponent()
返回所有行相同的结果。
对于TableCellRenderer
您需要使用getTableCellRendererComponent()
方法中的value
参数来确定扩展名和LogEntry
实例。
检查概念:编辑器和渲染器 。
这是给您的简单示例,我使用颜色而不是图标:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
public class TestFrame extends JFrame{
public TestFrame(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
pack();
setVisible(true);
}
private void init() {
JTable table = new JTable(new Object[][]{
{1,"doc"},
{2,"xlsx"},
{3,"abc"}
},new Object[]{"nmb","extension"});
table.getColumnModel().getColumn(1).setCellRenderer(getRenderer());
add(new JScrollPane(table));
}
private TableCellRenderer getRenderer() {
return new DefaultTableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);
if("doc".equals(value)){
tableCellRendererComponent.setBackground(Color.YELLOW);
} else if("xlsx".equals(value)){
tableCellRendererComponent.setBackground(Color.GREEN);
} else {
tableCellRendererComponent.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
}
return tableCellRendererComponent;
}
};
}
public static void main(String... strings) {
new TestFrame();
}
}
也不要像这里将Component
那样放到TableModel
logModel.setValueAt(new JLabel(), logRow, 5);
公正的价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.