简体   繁体   English

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

[英]JTable - how do i insert a new JLabel for each row in a specific column?

im been looking around on the internet for about 5 hours now to debug on this issue ive been having. 我已经在互联网上闲逛了大约5个小时,以调试该问题。 and Basically i haven't been able to find anywhere where a person tries to add a new JLabel for each row in a specific column. 基本上,我找不到任何人试图为特定列中的每一行添加新的JLabel的地方。

functionality explanation: i get a file url, i take the postFix which is usually xlsx or doc - this postfix i want to display in a JLabel in coalition with a Excel or Doc Icon -.- but what my current code does is just paint the same JLabel over and over again because it only sets the CellRenderer one time and uses it on all the rows dispite the fact that im setting it in a for-loop for each iteration - all my code is correct for this functionality up until the renderer only gets called once. 功能说明:我得到一个文件URL,我选择了通常为xlsx或doc的postFix-我想在JLabel中与Excel或Doc Icon联合显示此后缀-.-,但是我当前的代码只是在一遍又一遍地使用相同的JLabel,因为它只设置一次CellRenderer并在所有行上使用它,尽管我为每次迭代在for循环中都设置了它-我的所有代码对于此功能都是正确的,直到仅渲染器被叫一次。

so my question goes as follows - how do i add a new JLabel for each row in a Column ? 所以我的问题如下-如何为列中的每一行添加一个新的JLabel? - -

my code follows. 我的代码如下。

my TableCellRenderer: 我的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;
}

} }

where i make my model: (i have alot more code adding actionListeners to right-click functionality and what not but thats hardly relevant) 我在哪里制作模型:(我有很多代码将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);
  }

Where the magic was suppose to happen(update the log table after a search on logs) 神奇发生的地方(在搜索日志后更新日志表)

     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++;
        }
   }    

i have read the Java documentation for components and Editors- but none of the code examples are for a JLabel - probably because CellRenderer extends JLabel.. 我已经阅读了有关组件和编辑器的Java文档-但是所有代码示例都不是针对JLabel的-可能是因为CellRenderer扩展了JLabel。

i have allso sniffed up the info that the 'value' parameter in the getTableCellRendererComponent() method is the one that is supposed to be set dynamically somehow... any surgestions would be greatly apriciatet, feel free to ask any questions. 我一直都在嗅探这样的信息,即getTableCellRendererComponent()方法中的“值”参数是应该以某种方式动态设置的参数……任何手术都将非常昂贵,请随时提出任何问题。

thanks 谢谢

logModel.setValueAt(new JLabel(), logRow, 5); logModel.setValueAt(new JLabel(),logRow,5);

  • don't put JLabel, any JComponent to the model, XxxTableModel is designated to nest value for Renderer or Editor only, more in Oracle tutorial How to use Tables - Creating a Table Model 不要在模型中放置JLabel,任何JComponent,XxxTableModel仅用于嵌套Renderer或Editor的值,有关更多信息,请参见Oracle教程。如何使用表- 创建表模型

  • Renderer or Editor visually represents real JComponents, more in Oracle tutorial How to use Tables - Concepts: Editors and Renderers Renderer或Editor直观地代表了真正的JComponent,更多内容请参见Oracle教程如何使用表- 概念:Editors and Renderers

label.setIcon((ImageIcon) Pictures.getXlsx()); label.setIcon((ImageIcon)Pictures.getXlsx());

  • Icon should be placed into local variables or array, list, whatever of Icons, don't load any FileIO from Renderer, renderer can be called many times per one second, eg from all mouse, keys and methods inplemented in APIs 应该将图标放置在局部变量或数组,列表中,无论使用哪种图标,都不要从Renderer加载任何FileIO,可以每秒调用一次渲染器多次,例如从API中补充的所有鼠标,键和方法

Seems your problem in DefaultTableCellRenderer implementation. DefaultTableCellRenderer实现中似乎出现了您的问题。

You create renderer like JLabelRenderer(LogEntry log) because of, for all cells you have one instance of LogEntry , and log.getFileExtension() in getTableCellRendererComponent() returns same result for all rows. 您创建类似于JLabelRenderer(LogEntry log)渲染器是因为,对于所有单元格,您都有一个LogEntry实例,并且getTableCellRendererComponent() log.getFileExtension() getTableCellRendererComponent()返回所有行相同的结果。

In case of TableCellRenderer you need to use value parametr from getTableCellRendererComponent() method to determine extension and LogEntry instance. 对于TableCellRenderer您需要使用getTableCellRendererComponent()方法中的value参数来确定扩展名和LogEntry实例。

Examine Concepts: Editors and Renderers . 检查概念:编辑器和渲染器

Here is simple example for you, I use color instead of icons: 这是给您的简单示例,我使用颜色而不是图标:

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();
    }
}

在此处输入图片说明

Also don't put Component 's to TableModel like here logModel.setValueAt(new JLabel(), logRow, 5); 也不要像这里将Component那样放到TableModel logModel.setValueAt(new JLabel(), logRow, 5); just value. 公正的价值。

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

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