为什么我的JTable不允许我插入ImageIcon?

时间:2017-03-17 06:24:24

标签: java swing user-interface jtable imageicon

非常简单,我尝试了一些关于如何修改JTable以获取imageIcon的其他问题。我的包中有一个名为successIcon.png的图像。

这是我的JTable的代码,主要由Net Beans自动生成:

statusTable = new javax.swing.JTable();

statusTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {

},
new String [] {
    "Icons", "Message"
}
) {
Class[] types = new Class [] {
    javax.swing.ImageIcon.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
    false, false
};

public Class getColumnClass(int columnIndex) {
    return types [columnIndex];
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return canEdit [columnIndex];
}
});

我的一个按钮使用来自另一个.java文件的静态命令:

  DBCommands.executeCommand(sqlArea.getSelectedText(), (DefaultTableModel) statusTable.getModel(), selectArea);

这是它调用的方法的方法签名。这个命令被称为罚款,我包括它以防万一:

public static void executeCommand(String command, DefaultTableModel model, 
         JTextArea selectArea){

该命令将其传递给一个名为printStatus的方法,该方法应该更新JTable,但它不起作用。首先在icon下面会打印“successIcon.png”,但是使用我当前的代码它根本不会放任何东西:

public static void printStatus(String message, String command, PrintWriter statFileWriter, DefaultTableModel model){

    Object[] row = new Object[2]; // so I can add row to table

    ImageIcon icon = new ImageIcon("successIcon.png"); 

    row[0] = icon;
    row[1] = message + " (" + command + ")" + "\n";
    model.addRow(row);
   }

1 个答案:

答案 0 :(得分:2)

所以,我的快速讨厌的测试工作......

Working Images

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private final JTable statusTable;

        public TestPane() {
            statusTable = new javax.swing.JTable();
            statusTable.setRowHeight(200);

            statusTable.setModel(new javax.swing.table.DefaultTableModel(
                    new Object[][]{},
                    new String[]{
                        "Icons", "Message"
                    }
            ) {
                Class[] types = new Class[]{
                    javax.swing.ImageIcon.class, java.lang.String.class
                };
                boolean[] canEdit = new boolean[]{
                    false, false
                };

                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }

                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return canEdit[columnIndex];
                }
            });
            setLayout(new BorderLayout());
            add(new JScrollPane(statusTable));

            JButton add = new JButton("Add");
            add(add, BorderLayout.SOUTH);
            add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    DefaultTableModel model = (DefaultTableModel) statusTable.getModel();
                    Object[] row = new Object[2]; // so I can add row to table

                    ImageIcon icon = new ImageIcon("successIcon.jpg");

                    row[0] = icon;
                    row[1] = "Boo";
                    model.addRow(row);
                }
            });
        }

    }

}

<强> Cavets

  • successIcon.jpg必须与执行程序的目录相同(AKA工作目录)

结论

  • 图片未加载。这可能是因为您认为图像在哪里,并不是它的位置。我更喜欢使用ImageIO.read来加载图片,因为在图片完全加载之前它不会返回,如果图像无法找到,它会抛出异常
  • 您应该使用嵌入式资源,而不是从磁盘上加载资源。我推荐这个,因为&#34;工作&#34;程序的上下文可以更改,并且始终与程序的安装位置相同
  • 您传递的JTable的引用与屏幕上的引用不同。考虑提供一个runnable example来证明您的问题。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将减少混淆和更好的回应