繁体   English   中英

JTable-如何为特定列中的每一行插入一个新的JLabel?

[英]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());

  • 应该将图标放置在局部变量或数组,列表中,无论使用哪种图标,都不要从Renderer加载任何FileIO,可以每秒调用一次渲染器多次,例如从API中补充的所有鼠标,键和方法

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.

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