Drag and Drop fähige Trackliste..nurnoch ein kleines Problem

Status
Nicht offen für weitere Antworten.

braineater

Mitglied
EDIT: Die Liste ist soweit fertig hab nur noch ein problem das die lieder an den audioplayer übergeben werden...(steht alles im letzten post)


Hallo,
dieses Semester behandeln wir Java in Info.Nun sollen als Prüfung gleich ein umfangreicheres Projekt erstellen.Ich hab aber noch nicht so viel ahnung von java.Wir haben uns für einen Audioplayer entschieden,da dieser das leichteste der ganzen projekte war...l

Ich bin jetzt erstmal für die Programmierung einer Drag and Drop fähigen Playerliste zuständig
Die Liste soll sortierbar sein,man soll elemente löschen können, und man soll elemente per DND hinzufügen können

Welche Komponenten würdet ihr mir für so eine Liste empfehlen?Und hat eventuell jemand einen Link zu einem guten und verständlichen Tutorial zu DnD?

ich hoffe ihr könnt mir helfen


MFG
 

braineater

Mitglied
das was schandro geposted hat ist sowas wie ich es mir vorstelle.
...hat jemand dazu ein gutes Tuturial für mich(am besten in deutsch) oder ein paar hilfreiche tipps wie ich anfangen soll?

ist es möglich das man nur den Objektnamen in der Liste anzeigen lässt
Kann man die Objekte irgendwie einzeln auswählen(das sie dann zb markiert werden u dadurch an den Player übergeben werden zum abspielen)
Kann man es irgendwie realisieren das wenn man ein objekt löscht die anderen nachrücken?
kann man sortieralgorithmen in die liste einbauen?
 

André Uhres

Top Contributor
Hier ist ein einfaches Beispiel:
Code:
/*
 * FileDrop.java
 */

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));
        table = new JTable();
        table.setDragEnabled(true);
        table.setAutoCreateRowSorter(true);
        table.setFillsViewportHeight(true);
        table.setModel(new DefaultTableModel(new String[]{"Objekte", "Typ", "Aktiv"}, 0));
        transferHandler = new FileTransferHandler(table);
        table.setTransferHandler(transferHandler);
        dataPanel.add(new JScrollPane(table));
        add(dataPanel, BorderLayout.CENTER);
    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("File Drop");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //Create and set up the content pane.
        FileDrop fViewer = new FileDrop();
        frame.setContentPane(fViewer);
        //Display the window.
        frame.setVisible(true);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }

    public static void main(final String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        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();
                for (int i = 0; i < files.size(); i++) {
                    final File file = (File) files.get(i);
                    String name = file.getName();
                    model.addRow(new String[]{name, name.substring(name.indexOf(".") + 1), "1"});
                }
                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;
    }

    @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;
    }
}
Mehr zu JTable:
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
 

braineater

Mitglied
danke für das beispiel André

hab mal noch einige fragen dazu...

1.Ist es möglich das man auch daten aus der tabelle löschen kann?(zb mit markieren und entf)
2.kann man die daten auch schreibgeschützt machen?(also das man zb den liedtitel dann nur markieren kann)
3.Ist es möglich das wenn man ein lied markiert dieses dann an den Player übergeben wird(also dann wenn ich play drücke abgespielt wird)?Oder werden in der tabelle nur infos gesammelt?
4.Ist es möglich das die Tabelle nur bestimmte datentypen annimmt?

sry für die ganzen fragen aber ich bin mit java noch ziemlich unerfahren

mfg
 

André Uhres

Top Contributor
1. Wir können Zeilen löschen, wenn das TableModel eine Methode zum Löschen anbietet.
DefaultTableModel hat z.B. die Methode "removeRow".

2. Auch für die Editierbarkeit ist das TableModel zuständig:
wenn die Methode "isCellEditable" true zurückgibt, dann ist die Zelle editierbar, sonst nicht.

3. Wenn wir in der JTable die Referenz auf das entsprechende File Objekt (oder den Pfad) speichern,
und wir die selektierte Zeile abspielen wollen, brauchen wir nur das selektierte File Objekt an den Player zu übergeben
(bzw. die URL mit file.toURI().toURL()).

4. Wir können in "importData" den Dateityp überprüfen und nur die zugelassenen importieren.
 

braineater

Mitglied
hab wieder mal ein problem :oops:
ich hab jetzt noch einen button hinzugefügt mit dem ich dann die nicht benötigte reihe entfernen will
jedoch habe ich irgendwie keinen zugriff auf das Tabellenmodel oder die Tabelle :(
tut mir echt leid falls ich euch nerve :(
oder ist der ansatz mit dem button über einen ActionListener falsch?

EDIT: hab jetzt die variable für das model außerhalb angelegt und nun hab ich schonmal zugriff jedoch funktioniert die aktion irgendwie nicht :(
ich glaube das liegt am actionlistener

edit:
habs hinbekommen :)


Hab grade noch gesehen das wir auch einbauen müssen das man die Objekte innerhalb der Liste per Drag and Drop verschieben kann!Kann man das in die schon vorhanden JTable noch einabuen?

Wie stelle ich das mit den zugelassenen Datentypen an?also das per Drag and drop nur Musikdateien zugelassen werden?(Also wie kann ich das über die importData Fkt machen?)

Code:
public class FileDrop extends JPanel {

   private FileTransferHandler transferHandler;
   static JTable table;
   static DefaultTableModel model;

    public FileDrop() {
        
    	
        JPanel dataPanel = new JPanel();
        dataPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        model = new DefaultTableModel(new String[]{"Titel"}, 0);
        table = new JTable(model);
      
        table.setDragEnabled(true);
        table.setAutoCreateRowSorter(true);
        table.setFillsViewportHeight(true);
        
        transferHandler = new FileTransferHandler(table);
        table.setTransferHandler(transferHandler);
        
        dataPanel.add(new JScrollPane(table));
        add(dataPanel, BorderLayout.CENTER);
        
             
    }
    
      private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("File Drop");
        frame.setBounds(100, 100, 200, 500);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //Create and set up the content pane.
        FileDrop fViewer = new FileDrop();
        frame.setContentPane(fViewer);
        //Display the window.
        frame.setVisible(true);
        
        JButton but=new JButton();
        but.setBounds(10, 10, 60, 40);
        but.setText("Entfernen");
        
        ActionListener del = new ActionListener() {
        public void actionPerformed( ActionEvent e ) {
        model.removeRow(table.getSelectedRow());
        }
        };
          
        but.addActionListener(del);

        but.setVisible(true);
        frame.add(but);
        
        
    }

    public static void main(final String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

}
 

André Uhres

Top Contributor
>Hab grade noch gesehen das wir auch einbauen müssen das man die Objekte innerhalb der Liste
>per Drag and Drop verschieben kann!Kann man das in die schon vorhanden JTable noch einabuen?

Code:
private void enableRowDragging() {
    table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    table.addMouseMotionListener(new MouseMotionAdapter() {

        @Override
        public void mouseDragged(MouseEvent evt) {
            rowTo = table.convertRowIndexToModel(table.rowAtPoint(evt.getPoint()));
            if (rowTo != rowFrom && rowTo > -1 && rowTo < model.getRowCount()) {
                model.moveRow(rowFrom, rowFrom, rowTo);
                rowFrom = rowTo;
            }
        }
    });
    table.addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent evt) {
            rowFrom = table.convertRowIndexToModel(table.rowAtPoint(evt.getPoint()));
        }
    });
}


>Wie stelle ich das mit den zugelassenen Datentypen an?also das per Drag and drop nur
>Musikdateien zugelassen werden?(Also wie kann ich das über die importData Fkt machen?)

Code:
private List<String> supportedFormats = new ArrayList<String>();
{
    supportedFormats.add(".mp3");
    supportedFormats.add(".midi");
    supportedFormats.add(".mid");
    supportedFormats.add(".au");
    supportedFormats.add(".wav");
}
if (supportedFormats.contains(name.toLowerCase().substring(name.indexOf(".")))) {
    model.addRow(new String[]{name});
}
 

braineater

Mitglied
So das mit den datentypen hab ich hinbekommen,aber bei dem Drag and drop innerhalb der liste gibt es noch probleme
wenn ich die FKT von andre nehme will er das ich den mousemotionadapter oder so importiere...wenn ich das aber tue wird die override FKT komplett rot :oops:
 

braineater

Mitglied
MouseAdapter bzw MouseMotionAdapter kann nicht in einen Typ aufgelöst werden

wenn ich dann die entsprechenden klassen importiere kommt folgendes

Die Methode mouseDragged(MouseEvent) von Typ new MouseMotionAdapter(){} muss eine Supertypmethode überschreiben oder implementieren
und rowFrom und rowTo kann nicht aufgelöst werden

mfg und guten rutsch
 

André Uhres

Top Contributor
>Die Methode mouseDragged(MouseEvent) von Typ new MouseMotionAdapter(){} muss
>eine Supertypmethode überschreiben oder implementieren

Die Methode "mouseDragged(MouseEvent e)" ist eine Methode
der abstrakten Klasse "MouseMotionAdapter" und kann problemlos
überschrieben werden (siehe API).

>rowFrom und rowTo kann nicht aufgelöst werden

Das sind nur Instanzvariablen vom Typ int.
 

braineater

Mitglied
So habs jetzt zumindest schonmal ohne Fehler...nur leider geht es irgendwie noch nicht da ich nicht so recht weiß wohin mit der Funktion

EDIT:geht doch :) musste nur das rowdragging noch static machen und dann in die GUI FKT einfügen

vielen dank Andre!!!!!

Hier mal mein Quellcode

Code:
/*
* FileDrop.java
*/

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseEvent;



import javax.swing.table.DefaultTableModel;

public class FileDrop extends JPanel {

   private FileTransferHandler transferHandler;
   static JTable table;
   static DefaultTableModel model;
   static int rowTo,rowFrom;

    public FileDrop() {
           	
        JPanel dataPanel = new JPanel();
        dataPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        model = new DefaultTableModel(new String[]{"Titel"}, 0); //Name der Spalten vergeben und anzahl der Reihen festlegen
        table = new JTable(model);
      
        table.setDragEnabled(true);
        table.setAutoCreateRowSorter(true);
        table.setFillsViewportHeight(true);
        
        transferHandler = new FileTransferHandler(table);
        table.setTransferHandler(transferHandler);
        
        dataPanel.add(new JScrollPane(table));
        add(dataPanel, BorderLayout.CENTER);
        
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        
             
    }
    
private static void enableRowDragging() {
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseDragged(MouseEvent evt) {
                rowTo = table.convertRowIndexToModel(table.rowAtPoint(evt.getPoint()));
                if (rowTo != rowFrom && rowTo > -1 && rowTo < model.getRowCount()) {
                    model.moveRow(rowFrom, rowFrom, rowTo);
                    rowFrom = rowTo;
                }
            }
        });
        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent evt) {
                rowFrom = table.convertRowIndexToModel(table.rowAtPoint(evt.getPoint()));
            }
        });
    }

    public static void main(final String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
       SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
                
            }
            
        });
       
  }


    private static void createAndShowGUI() //grafische Oberfläche erstellen
    {
       
        JFrame frame = new JFrame("File Drop");
        frame.setBounds(100, 100, 500, 540);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //Create and set up the content pane.
        FileDrop fViewer = new FileDrop();
        frame.setContentPane(fViewer);
        //Display the window.
        frame.setVisible(true);
        
        JButton but=new JButton();
        but.setBounds(10, 10, 60, 40);
        but.setText("Entfernen");
        
        ActionListener del = new ActionListener() {
            public void actionPerformed( ActionEvent e ) {
              model.removeRow(table.getSelectedRow());
              
            }
          };
          
          but.addActionListener(del);
          
        but.setVisible(true);
       frame.add(but);
       enableRowDragging();
        
        
    }
    



class FileTransferHandler extends TransferHandler {

    private DataFlavor fileFlavor;
    private JTable table;
    private JFrame frame;
    private List<String> supportedFormats = new ArrayList<String>();
    {
        supportedFormats.add(".mp3");
        supportedFormats.add(".midi");
        supportedFormats.add(".mid");
        supportedFormats.add(".wav");
    } 

    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();

                for (int i = 0; i < files.size(); i++) {
                    final File file = (File) files.get(i);
                    String name = file.getName();
                    if (supportedFormats.contains(name.toLowerCase().substring(name.indexOf(".")))) {
                    	model.addRow(new String[]{name, name.substring(name.indexOf(".") + 1), "1"});
                    }
                    else
                    {
                    	JOptionPane.showMessageDialog(frame,"Die Datei hat ein nicht unterstütztes File Format!",name,JOptionPane.ERROR_MESSAGE);
                    }
                }
                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;
    }

    @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;
    }
    
}
}
 

braineater

Mitglied
Hab wieder ein Problem...aber das ist dann eigentlich das letzte ^^

Ich weiß nicht genau wie es anstelle das ich die Dateien dann aus der Liste abspielen kann
Ich hab mir eigentlich schon überlegt wie ich es machen könnte weiß aber nicht wie ich das dann umsetzten kann:
Ich würde schauen welche Datei ausgewählt ist...dann würde ich von der ausgewählten Datei den Pfad nehmen und diesen an den Audio Teil meines Programmes übergeben.

Ich brauche den Pfad zur Datei...ich will aber nicht das man den Pfad in der Liste sieht
So wie die Liste jetzt ist wird ja nur der Name gespeichert,oder?

Zum abspielen verwende ich javax.sound.sampled.*

EDIT: Hab jetzt zumindest schonmal den pfad noch in die tabelle gespeichert...nun muss ich eigentlich nurnoch auslesen

EDIT: So nun hab ich schon das ich den Pfad auslesen kann
und zwar so

Code:
DnD.table.getValueAt(DnD.table.getSelectedRow(), 1)

mit dem stück quelltext bekomme ich den pfad ausgelesen
wenn ich nun aber den pfad in dieser form einem File Container zuweisen will meckert der compiler da der pfad ein OBjekt ist...er macht mir als vorschlag das Object als File zu casten,was aber nix bringt :(
jedoch muss ich den pfad irgendwie in einen Filecontainer bekommen da der .getAudioInputStream nur Files akzeptiert...kann mir wer helfen??

MFG
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Drag & Drop Hilfe Java Basics - Anfänger-Themen 5
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
M Drag & Drop - Interaktion zwischen Java und dem OS Java Basics - Anfänger-Themen 1
B Drag & Drop für Panels Java Basics - Anfänger-Themen 6
B List - Drag&Drop Java Basics - Anfänger-Themen 8
P Input/Output String via Drag & Drop auf jar-Archiv Java Basics - Anfänger-Themen 2
K Eclipse wie Swing per Drag und Drop erstellen Java Basics - Anfänger-Themen 2
U Drag&Drop von Tabelle in Textfeld Java Basics - Anfänger-Themen 3
S Drag and Drop von .txt Dateien in eine Liste Java Basics - Anfänger-Themen 2
M Drag and Drop eines Graphikelements Java Basics - Anfänger-Themen 19
R Drag&Drop mit Parametern Java Basics - Anfänger-Themen 6
O Drag & Drop mit Image? Java Basics - Anfänger-Themen 2
G Drag n' Drop - Probleme mit Transferable Java Basics - Anfänger-Themen 10
T ganzes Object Drag und Drop Java Basics - Anfänger-Themen 19
G Drag and Drop Java Basics - Anfänger-Themen 6
G Drag and drop Verständnissproblem. Java Basics - Anfänger-Themen 8
N drag and drop mit JList Java Basics - Anfänger-Themen 5
B Drag&Drop mit Swing Java Basics - Anfänger-Themen 17
B Swing: Zeichnen mit Drag and Drop Java Basics - Anfänger-Themen 11
R Drag'n'Drop Box Java Basics - Anfänger-Themen 2
E Cursor Image bei Drag'n'Drop ändern Java Basics - Anfänger-Themen 6
X Gwt DnD, Drag auf Droparea in anderer Klasse? Java Basics - Anfänger-Themen 0
K Drop-down Menü (swing) Java Basics - Anfänger-Themen 4
S Java und HTML- Drop Down- Mehrfachauswahl Java Basics - Anfänger-Themen 3
D Zwei Drop downs für voneinander abhängige Bundesländer- und Städteauswahl Java Basics - Anfänger-Themen 9
K SWT Drop Box Java Basics - Anfänger-Themen 11
E Adobe Designer Drop Down Feld & If Abfrage Java Basics - Anfänger-Themen 4
M statt drop down menü - buttons Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben