Drag&Drop JTable; Renderer füllt alle Zellen

Status
Nicht offen für weitere Antworten.

emse88

Mitglied
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:

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.
 

emse88

Mitglied
Wenn ich das weglasse dann bekomme ich schon beim Start lauter Exceptions und alle Zellen werden mit "Null" gefüllt.
 

Ebenius

Top Contributor
emse88 hat gesagt.:
Wenn ich das weglasse dann bekomme ich schon beim Start lauter Exceptions
Dann hast Du wahrscheinlich was anderes auskommentiert als ich meinte. Ich meinte das so:
Code:
       if(value instanceof ImageIcon) { 
            setIcon( (ImageIcon)value); 
            setText(""); 
        }    
        else /* if(value instanceof String) */ { 
            setIcon( null ); 
            System.out.println(value); 
            setText(String.valueOf(value)); 
        }

Oder besser noch so:
Code:
class myCellRenderer extends DefaultTableCellRenderer{ 
    public myCellRenderer(){ 
        setOpaque(true); 
    } 
    
    protected void setValue(Object value) {
        if(value instanceof Icon) { 
            setIcon((Icon)value); 
            setText(""); 
        } else {
            setIcon(null); 
            setText((value == null) ? "" : value.toString());
        }
    }
}
 

emse88

Mitglied
Ich danke dir, es funktioniert mit
Code:
protected void setValue(Object value) {
        if(value instanceof Icon) {
            setIcon((Icon)value);
            setText("");
        } else {
            setIcon(null);
            setText((value == null) ? "" : value.toString());
        }
}

Ich verstehe aber nicht, warum es jetzt funktioniert oO.
 

André Uhres

Top Contributor
emse88 hat gesagt.:
Ich verstehe aber nicht, warum es jetzt funktioniert.
Weil jetzt ein default Icon/Text gesetzt wird (setValue wird in getTableCellRendererComponent
von DefaultTableCellRenderer aufgerufen). Vorher wurde ja nix gesetzt, wenn der Datentyp
kein Icon und kein String war (z.B. null). In dem Fall bleibt das drin, was vorher
einmal gesetzt wurde und wird vom Renderer wie mit einem Stempel auf jede Zelle "gedruckt".

Nur noch zur Information: das package "sun.awt.shell" ist verboten.
 

Ebenius

Top Contributor
André Uhres hat gesagt.:
Nur noch zur Information: das package "sun.awt.shell" ist verboten.

Da hat André Recht. Alternativ: Hol Dir doch den FileSystemView und frag den. Das darfst Du. In etwa:
Code:
FileSystemView.getFileSystemView().getSystemIcon(bild)

Noch ein Hinweis: Klassen-Namen fangen mit großem Buchstaben an und sind CamelCase. Also myCellRendererMyCellRenderer.

Ebenius
 
G

Guest

Gast
Danke für die Hinweise.
Ja, das mit den kleinen Icons ist etwas suboptimal.
Habe aber auch bis jetzt nichts besseres gefunden, als die "verbotene" Methode.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
C JTable Drag and Drop von Zeilen innerhalb einer Table AWT, Swing, JavaFX & SWT 2
N Swing JTable und Drag und Drop AWT, Swing, JavaFX & SWT 2
R Drag an Drop JTable Zelle AWT, Swing, JavaFX & SWT 6
F Swing Problem mit Drag&Drop in JTable AWT, Swing, JavaFX & SWT 4
M Swing JTable Drag'n'Drop von Dateien AWT, Swing, JavaFX & SWT 3
C Drag an Drop vom JTree zur JTable AWT, Swing, JavaFX & SWT 4
G JTable drag and drop AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop einzelner Zellen in einer JTable AWT, Swing, JavaFX & SWT 12
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
R Drag & Drop einer einzelnen Zelle (JTable) AWT, Swing, JavaFX & SWT 2
A JavaFX JavaFX images per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 1
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
AmsananKING ListView Drag And Drop AWT, Swing, JavaFX & SWT 0
AmsananKING Drag And Drop Filenames Inside A Listview AWT, Swing, JavaFX & SWT 1
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
N Drag and Drop Fenster AWT, Swing, JavaFX & SWT 11
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
D JavaFX Pane per Drag&Drop bewegen? AWT, Swing, JavaFX & SWT 2
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
F Drag und Drop AWT, Swing, JavaFX & SWT 0
L JavaFX JavaFX Chart Drag and Drop AWT, Swing, JavaFX & SWT 3
D JavaFX Drag&Drop mehrerer TreeViews oder TableViews AWT, Swing, JavaFX & SWT 1
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
U Drag and Drop mit imageview AWT, Swing, JavaFX & SWT 0
U Drag and Drop imageviews AWT, Swing, JavaFX & SWT 8
D SteelSeries in Netbeans als Drag-and-Drop einbinden AWT, Swing, JavaFX & SWT 0
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
S Swing Suche Drag & Drop Beispiele AWT, Swing, JavaFX & SWT 1
A Drag and Drop mit JAVAFX- Scenebuilder AWT, Swing, JavaFX & SWT 1
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
R Drag and Drop Problem auf Jpanel AWT, Swing, JavaFX & SWT 2
A Drag and Drop eigener Objekte AWT, Swing, JavaFX & SWT 7
C Drag and Drop (inventar) AWT, Swing, JavaFX & SWT 15
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
Iron Monkey JFileChooser - Drag and Drop AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
HaukeG Swing Drag & Drop in verschiedenen Varianten AWT, Swing, JavaFX & SWT 4
S Swing Drag&Drop mit TransferHandler und JPanels AWT, Swing, JavaFX & SWT 8
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
R Drag 'n Drop AWT, Swing, JavaFX & SWT 3
S Selektion bei Drag&Drop AWT, Swing, JavaFX & SWT 4
C Swing Drag and Drop mit Objekten in einem Fenster. AWT, Swing, JavaFX & SWT 9
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
F Drag & Drop durch Verbindungslinien AWT, Swing, JavaFX & SWT 10
T Swing Drag and Drop - JLabels tauschen statt überschreiben AWT, Swing, JavaFX & SWT 11
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
K JButtons innerhalb eines JPanels verschieben (DRAG&DROP) AWT, Swing, JavaFX & SWT 5
B Drag and Drop AWT, Swing, JavaFX & SWT 6
K Drag and Drop Workbench AWT, Swing, JavaFX & SWT 2
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
F SWT Drag and Drop im TreeViewer AWT, Swing, JavaFX & SWT 4
B Swing Drag&Drop mit Feedback (Image am Mauszeiger) AWT, Swing, JavaFX & SWT 7
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
A TransferHandler & Drag n' Drop AWT, Swing, JavaFX & SWT 2
D Drag & Drop - node.isRoot AWT, Swing, JavaFX & SWT 3
E Swing Drag n Drop Verschieben von Labels o.ä. AWT, Swing, JavaFX & SWT 10
E Swing Beim Drag & Drop, Drag verbieten?! AWT, Swing, JavaFX & SWT 2
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
E Drag&Drop zwischen 2 Listen AWT, Swing, JavaFX & SWT 5
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Drag and Drop JPanel auf JPanel nach drop erneut verschieben? AWT, Swing, JavaFX & SWT 3
M Drag and Drop: Quellfenster AWT, Swing, JavaFX & SWT 2
M Buttons per Drag & Drop im GridBagLayout verschieben AWT, Swing, JavaFX & SWT 6
M Swing JList > Drag & Drop AWT, Swing, JavaFX & SWT 2
Z Drag and Drop auf Application AWT, Swing, JavaFX & SWT 3
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
H Drag&Drop von JComponents AWT, Swing, JavaFX & SWT 6
H Drag&Drop mit GWT AWT, Swing, JavaFX & SWT 8
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
V SWT TreeViewer Drag'n'Drop LocalSelectionTransfer AWT, Swing, JavaFX & SWT 10
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
B SWT - Drag & Drop innerhalb einer Table AWT, Swing, JavaFX & SWT 3
S Drag'n'Drop AWT, Swing, JavaFX & SWT 8
M Drag & Drop in Swing (createTransferable) AWT, Swing, JavaFX & SWT 6
T Drag Quelle beim Drop AWT, Swing, JavaFX & SWT 6
A Drag & Drop von Zeilen innerhalb einer Tabelle AWT, Swing, JavaFX & SWT 2
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5
P Dateien per Drag&Drop ins Java-Fenster ziehen AWT, Swing, JavaFX & SWT 8
G JTree Node ggf. aufklappen bei Drag & Drop? AWT, Swing, JavaFX & SWT 7
J Drag'n Drop imm selben Frame unterbinden AWT, Swing, JavaFX & SWT 3
S Table Row per Drag and Drop in andere Table schieben? AWT, Swing, JavaFX & SWT 14
X wiedermal Drag n Drop AWT, Swing, JavaFX & SWT 2
P Drag & Drop AWT, Swing, JavaFX & SWT 2
X Drag and Drop AWT, Swing, JavaFX & SWT 2
F Drag&Drop Jlist -> JList AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben