Почему мой 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, но он не работает. Сначала под значком он напечатал бы "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 ответ
Решение
Итак, мой быстрый и неприятный тест работает...
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
загружать изображения, потому что он не вернется, пока изображение не будет полностью загружено, и выдаст исключение, если изображение не может быть найдено - Вы должны использовать встроенные ресурсы вместо загрузки ресурсов с диска. Я бы порекомендовал это, потому что "рабочий" контекст программы может меняться и не всегда находится в том же месте, где установлена программа
- Ссылка
JTable
Ваше прохождение не является той же ссылкой на экране. Подумайте о предоставлении работающего примера, который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, и освещает проблему, с которой вы столкнулись. Это приведет к меньшему беспорядку и лучшим ответам