Hallo,
habe folgendes Problem.
Ich habe eine JTable mit Drag and Drop, wo ich Dateien ausm Explorer auf eine bestimmte Zelle ziehe. Der überschriebene DefaultCellRenderer soll das aus der Datei gezogene Icon in der Zelle zeichnen. Funktioniert zwar, aber irgendwie werden dann alle Zellen mit dem Icon gefüllt. Hier der Code:
Wäre cool wenn mir da einer auf die Sprünge helfen würde.
habe folgendes Problem.
Ich habe eine JTable mit Drag and Drop, wo ich Dateien ausm Explorer auf eine bestimmte Zelle ziehe. Der überschriebene DefaultCellRenderer soll das aus der Datei gezogene Icon in der Zelle zeichnen. Funktioniert zwar, aber irgendwie werden dann alle Zellen mit dem Icon gefüllt. Hier der Code:
Code:
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;
public class FileDrop extends JPanel {
private FileTransferHandler transferHandler;
private JTable table;
public FileDrop() {
super(new BorderLayout());
JPanel dataPanel = new JPanel(new BorderLayout());
dataPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
myCellRenderer renderer = new myCellRenderer();
table = new JTable();
table.setDragEnabled(true);
table.setModel(new DefaultTableModel(4, 4));
table.setRowHeight(50);
transferHandler = new FileTransferHandler(table);
//Renderer der Tabelle übergeben, damit diese Icons erkennt
table.setDefaultRenderer(Object.class, renderer);
table.setTransferHandler(transferHandler);
dataPanel.add(new JScrollPane(table));
add(dataPanel, BorderLayout.CENTER);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("File Drop");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
FileDrop fViewer = new FileDrop();
frame.setContentPane(fViewer);
frame.setVisible(true);
frame.setSize(800, 600);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}
class FileTransferHandler extends TransferHandler {
private DataFlavor fileFlavor;
private JTable table;
FileTransferHandler(final JTable list) {
this.table = list;
fileFlavor = DataFlavor.javaFileListFlavor;
}
@Override
public boolean importData(final JComponent c, final Transferable t) {
if (!canImport(c, t.getTransferDataFlavors())) {
return false;
}
try {
if (hasFileFlavor(t.getTransferDataFlavors())) {
final List files = (List) t.getTransferData(fileFlavor);
final DefaultTableModel model = (DefaultTableModel) table.getModel();
final File file = (File) files.get(0);
ImageIcon img = ladeIcon(file);
String name = file.getName();
int row = table.getSelectedRow();
int column = table.getSelectedColumn();
model.setValueAt(img, row, column);
return true;
}
} catch (final UnsupportedFlavorException ufe) {
System.out.println("importData: unsupported data flavor");
} catch (final IOException ioe) {
System.out.println("importData: I/O exception");
}
return false;
}
public ImageIcon ladeIcon(File bild){
try{
sun.awt.shell.ShellFolder sf =
sun.awt.shell.ShellFolder.getShellFolder(bild);
ImageIcon icon = new ImageIcon(sf.getIcon(true));
return icon;
}
catch(Exception e){
return null;
}
}
@Override
public boolean canImport(final JComponent c, final DataFlavor[] flavors) {
return hasFileFlavor(flavors);
}
private boolean hasFileFlavor(final DataFlavor[] flavors) {
for (int i = 0; i < flavors.length; i++) {
if (fileFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
}
//DefaultTableCellRenderer für Icons überschreiben
class myCellRenderer extends DefaultTableCellRenderer{
public myCellRenderer(){
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if(value instanceof ImageIcon) {
setIcon( (ImageIcon)value);
setText("");
}
else if(value instanceof String){
setIcon( null );
System.out.println(value);
setText(String.valueOf(value));
}
return this;
}
}
Wäre cool wenn mir da einer auf die Sprünge helfen würde.