【问题标题】:How to get Icon from JTable如何从 JTable 中获取图标
【发布时间】:2015-03-18 22:57:41
【问题描述】:

我已使用以下代码更改了JTable 中的单元格渲染以显示图像而不是文本:

base_table.getColumnModel().getColumn(3).setCellRenderer(new TableCellRenderer() {

    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value,
            boolean bln, boolean bln1, int i, int i1) {
        JLabel lbl = new JLabel();
        lbl.setIcon((ImageIcon) value);
        return lbl;
    }
});

现在,我希望能够获取JTable 中每一行的图像,以便将其保存在数据库中。我怎么能这样做?

【问题讨论】:

  • 图像是否已经在您的数据模型中?
  • 与您的问题无关:不要在每次调用时创建新的组合,而是只创建一次并在以后的调用中配置
  • @trashgod,是的,我认为他在那儿有一些图像,而另一些则没有。所以无论如何,如果首先我们已经拥有包含 JLabel 的单元格,如何在每个单元格上设置图像?
  • @mKorbel 的示例展示了如何为Icon 获取default renderer,但您可能希望保留对模型中图像的引用; List<Image> 是有道理的。

标签: java swing jtable imageicon


【解决方案1】:

我无法抗拒只是一个例子

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.*;
import javax.swing.table.*;

public class TableIcon extends JFrame implements Runnable {

    private static final long serialVersionUID = 1L;
    private JTable table;
    private JLabel myLabel = new JLabel("waiting");
    private int pHeight = 40;
    private boolean runProcess = true;
    private int count = 0;

    public TableIcon() {
        ImageIcon errorIcon = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
        ImageIcon infoIcon = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon");
        ImageIcon warnIcon = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon");
        String[] columnNames = {"Picture", "Description"};
        Object[][] data = {{errorIcon, "About"}, {infoIcon, "Add"}, {warnIcon, "Copy"},};
        DefaultTableModel model = new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model);
        table.setRowHeight(pHeight);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
        myLabel.setPreferredSize(new Dimension(200, pHeight));
        myLabel.setHorizontalAlignment(SwingConstants.CENTER);
        add(myLabel, BorderLayout.SOUTH);
        new Thread(this).start();
    }

    public void run() {
        while (runProcess) {
            try {
                Thread.sleep(1250);
            } catch (Exception e) {
                e.printStackTrace();
            }
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    ImageIcon myIcon = (ImageIcon) table.getModel().getValueAt(count, 0);
                    String lbl = "JTable Row at :  " + count;
                    myLabel.setIcon(myIcon);
                    myLabel.setText(lbl);
                    count++;
                    if (count > 2) {
                        count = 0;
                    }
                }
            });
        }
    }

    public static void main(String[] args) {
        TableIcon frame = new TableIcon();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setLocation(150, 150);
        frame.pack();
        frame.setVisible(true);
    }
}

【讨论】:

  • -1 用于覆盖表的 getColumnClass - 这绝对是 model 的责任(去年夏天我怎么会错过这个 :-)
  • @kleopatra 去年夏天真的很奇怪,:-)
  • insistive me:视图不能事后猜测模型的意图(如果模型故意返回尽可能广泛的类型,因为它允许并且实际上包含各种图标、字符串、数字...... )?虽然这只是一个示例——我们永远不会在任何现实世界环境中编码——错误放置正在蔓延,请参阅 f.i stackoverflow.com/questions/9239270/…
  • 另见此(最近更新)answer
【解决方案2】:

JTable 中存储的数据可以在其TableModel 中找到。但是由于通常是您的代码构建了这个TableModel(通常来自列表或数组),因此您应该能够从此列表或数组中获取图标。否则,只需使用 table.getModel().getValueAt(row, column),并将其转换为 ImageIcon

【讨论】:

  • @mKorbel:感谢您的编辑,但向量是一个列表,无需重写 getColumnClass 即可将 ImageIcon 放入表模型中(特别是因为 OP 对此列有特定的渲染器)。请建议下次修改而不是为我做。
  • 我从 table.getModel().getValueAt(row, column) 得到一个字符串
  • 那么您的渲染器代码不正确,因为它将单元格中的值转换为 ImageIcon。你应该知道你的模型包含什么。你如何构建表格模型?
  • @JB Nizet 对于 getColumnClass 存在 :-),只是 Column.class 只能一次正确地执行此操作,Renderer 用于修改 TableCell 中的某些内容,而不是用于创建 ...,只是什么都不做,(@kleopatra)通知错误,请阅读stackoverflow.com/questions/5614875/…,没有比这更好的了,
  • @mKorbel:getColumnClass 用于让 JTable 知道它必须在列单元格上设置哪种渲染器。如果像 OP 那样明确设置渲染器,则不需要 getColumnClass。
【解决方案3】:

您应该已经拥有表格模型中的所有图像。因此,您只需从模型中获取图像,然后将它们保存在您的数据库中。

在您的单元格渲染器中,您拥有Object value 类型,然后您使用(ImageIcon) value 将其转换为lbl.setIcon((ImageIcon) value); 中的ImageIcon

当您从模型中获取数据时,您也可以这样做:

ImageIcon myIcon = 
         (ImageIcon) base_table.getModel().getValueAt(rowIndex, 3);

其中 3 是带有图像的列的 columnIndex,rowIndex 是您想要的行。

【解决方案4】:

下面是正确的图像渲染器类。

class SimpleCellRenderer extends DefaultTableCellRenderer{



    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 

    {
         Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
               column);
      ((JLabel)cell).setIcon((Icon)value);
      ((JLabel)cell).setText("");
      ((JLabel)cell).setHorizontalAlignment(JLabel.CENTER);

      if (isSelected) {
         cell.setBackground(Color.white);
      } else {
         cell.setBackground(null);
      }
      //((AbstractTableModel)table.getModel()).fireTableCellUpdated(row,column);

      return cell;
   }


    }

下面是自动填充所有内容的方法。 私有 void formWindowOpened(java.awt.event.WindowEvent evt)

{                                  
        // TODO add your handling code here:

        fillIcon();  
    } 

   public void fillIcon() {
        int i,j,rowValue,colValue;
         int cols= student.getColumnCount();
         int rows=student.getRowCount();

         for(i =0 ;i<rows ;i++)
         {
             for(j=3; j<cols;j++)
             {
                 rowValue = i;
                 colValue = j;
                 String value = (String)student.getValueAt(rowValue, colValue);

                 if(value.equals("h"))//here h is the value stored in your database which is used to set some icon in place of value h.
{

            ImageIcon icon = new ImageIcon(getClass().getResource("dash.png"));
            student.setValueAt(icon, rowValue, colValue);
            student.getColumnModel().getColumn(colValue).setCellRenderer(new SimpleCellRenderer());
        }

【讨论】:

    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多