JInternalframe auf DropTarget droppen?

Tine2

Mitglied
Hallo,

ich programmiere gerade eine Anwendung, bei der man in einem Fenster per Button neue Panel erstellen kann, die wiederum weitere Komponenten enthalten (JTextfield, JButton, etc.). Diese Panel sollen allerdings in meinem Anwendungsfenster bewegbar sein, weswegen ich hier JInternalframe verwende, da ja, wenn man ein JPanel einem JPanel hinzufügt, dieses fest verankert wird. Mit JInternalframe kann ich die Panel auch schön frei bewegen.
So weit so gut. Das funktioniert auch alles soweit.
Nun sollen allerdings die Panel, wenn man sie auf eine Fläche(DropTarget) droppt, die drop()-Methode (DropTargetListener) dieser Fläche ansprechen. Allerdings passiert beim Droppen nichts.

Ist es denn überhaupt generell möglich, das diese Methode überhaupt auf das Droppen eines JInternalframes reagiert oder soll ich lieber einen anderen Container anstelle JInternalframe verwenden?

Ich habe schon viele Varianten mit Transferhandler, MouseEvent, etc. probiert, allerdings bekomme ich es nicht hin. Bin mir allerdings auch unsicher, wer genau jetzt eigentlich alles einen Transferhandler braucht, damit das funktionert. Die Fläche, auf die gedroppt werden soll, ist wie gesagt ein DropTarget, aber das reicht ja wohl noch nicht.

Wäre super, wenn mir jemand helfen könnte, sitze da jetzt schon sehr lange dran.

Viele Grüße,
Tine
 

Ebenius

Top Contributor
Beim DragNDrop braucht die Source und das Target je einen TransferHandler. Aber die Verbindung zu JInternalFrames (die ja mit DragNDrop nichts zu tun haben) sehe ich nicht.

Hast Du die Zusammenhänge richtig verstanden? DragNDrop ist ein Mechanismus um Daten zwischen Komponenten zu transferieren. Ähnlich wie Copy&Paste.

Ebenius
 

Tine2

Mitglied
Danke erstmal für die Antwort.

Ich habe eben JInternalFrames verwendet, weil ich gerne ein frei verschiebbares Panel in meinem Fenster (JPanel) haben möchte, das immer per Button erstellt werden kann. Wenn ich aber dann beim Button-Klick einfach nur sage
Java:
hauptPanel.add(panelBewegbar);
dann wird das panelBewegbar ja fest dem hauptPanel hinzugefügt und ich kann es nicht mehr frei rumschieben.

Oder gibt es da eine andere Möglichkeit, das Panel rumschiebbar (also quasi dragbar) zu machen? Muss ja nicht JInternalFrame sein, habe halt nichts anderes gefunden.

Wäre wirklich dankbar für eine Hilfe, stehe da irgendwie auf dem Schlauch!
Oder habe ich nicht verständlich genug beschrieben, was ich programmieren möchte?
 

Tine2

Mitglied
Eben, deswegen habe ich es ja auch benutzt. Im Moment erzeuge ich die JInternalFrames auch auf einer JDesktopPane, habe aus versehen JPanel geschrieben, sorry.
Allerdings möchte ich das Panel dann beim Verschieben auf eine Fläche ziehen, die ein DropTarget ist, und dann quasi beim wieder loslassen der Maus die drop()-Methode ansprechen. Oder wird das nicht gehen?

Also das verschieben klappt ja auch super, aber halt wie gesagt schaffe ich es nicht, dass die drop()-Methode angesprochen wird. Habe z.B. auch schon dem JInternalFrame einen Transferhandler gegeben, aber da ist nichts passiert.
 

Ebenius

Top Contributor
Nur als Ideengeber zum Herumspielen und mehr heraus finden:
Java:
/* (@)JInternalFrameDnDTestGui.java */

/* Copyright 2010 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.beans.PropertyVetoException;
import java.util.Arrays;

import javax.swing.*;

/**
 * @author Sebastian Haufe
 */
public class JInternalFrameDnDTestGui {

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    final JDesktopPane desktopPane = new JDesktopPane();
    final DesktopManager desktopManager = desktopPane.getDesktopManager();
    desktopPane.setPreferredSize(new Dimension(640, 480));
    desktopPane.setDesktopManager(new DesktopManager() {

      public void setBoundsForFrame(
            JComponent f,
            int newX,
            int newY,
            int newWidth,
            int newHeight) {
        desktopManager.setBoundsForFrame(f, newX, newY, newWidth, newHeight);
      }

      public void resizeFrame(
            JComponent f,
            int newX,
            int newY,
            int newWidth,
            int newHeight) {
        desktopManager.resizeFrame(f, newX, newY, newWidth, newHeight);
      }

      public void openFrame(JInternalFrame f) {
        desktopManager.openFrame(f);
      }

      public void minimizeFrame(JInternalFrame f) {
        desktopManager.minimizeFrame(f);
      }

      public void maximizeFrame(JInternalFrame f) {
        desktopManager.maximizeFrame(f);
      }

      public void iconifyFrame(JInternalFrame f) {
        desktopManager.iconifyFrame(f);
      }

      public void endResizingFrame(JComponent f) {
        desktopManager.endResizingFrame(f);
      }

      public void endDraggingFrame(JComponent f) {
        desktopManager.endDraggingFrame(f);
      }

      public void dragFrame(JComponent f, int newX, int newY) {
        desktopManager.dragFrame(f, newX, newY);
        final JDesktopPane desktopPane =
              (JDesktopPane) SwingUtilities.getAncestorOfClass(
                    JDesktopPane.class, f);
        if (desktopPane != null) {
          final TransferHandler tf = desktopPane.getTransferHandler();
          if (tf != null) {
            final AWTEvent currentEvent = EventQueue.getCurrentEvent();
            final MouseEvent me =
                  currentEvent instanceof MouseEvent
                        ? (MouseEvent) currentEvent
                        : null;

            if (me != null) {
              final Point point =
                    SwingUtilities.convertPoint(me.getComponent(), me
                          .getPoint(), desktopPane);
              if (point.x < 0
                    || point.y < 0
                    || point.x > desktopPane.getWidth()
                    || point.y > desktopPane.getHeight()) {
                tf.exportAsDrag(desktopPane, me, TransferHandler.LINK);
              }
            }
          }
        }
      }

      public void deiconifyFrame(JInternalFrame f) {
        desktopManager.deiconifyFrame(f);
      }

      public void deactivateFrame(JInternalFrame f) {
        desktopManager.deactivateFrame(f);
      }

      public void closeFrame(JInternalFrame f) {
        desktopManager.closeFrame(f);
      }

      public void beginResizingFrame(JComponent f, int direction) {
        desktopManager.beginResizingFrame(f, direction);
      }

      public void beginDraggingFrame(JComponent f) {
        desktopManager.beginDraggingFrame(f);
      }

      public void activateFrame(JInternalFrame f) {
        desktopManager.activateFrame(f);
      }
    });

    desktopPane.setTransferHandler(new TransferHandler("selectedFrame") {

      /** Serial version UID */
      private static final long serialVersionUID = 1L;

      @Override
      public int getSourceActions(JComponent c) {
        return c instanceof JDesktopPane ? TransferHandler.LINK : super
              .getSourceActions(c);
      }

      @Override
      public void exportAsDrag(JComponent comp, InputEvent e, int action) {
        super.exportAsDrag(comp, e, action);
      }
    });

    /* internal frame */
    final JInternalFrame internalFrame =
          new JInternalFrame("Huhu", true, true, true, true);
    internalFrame.getContentPane().add(new JScrollPane(new JTable(9, 3)));
    internalFrame.pack();
    desktopPane.add(internalFrame);
    internalFrame.setVisible(true);
    try {
      internalFrame.setSelected(true);
    } catch (PropertyVetoException ex) {}

    final JLabel dropContainer = new JLabel("Drop Frame here!");
    dropContainer.setTransferHandler(new TransferHandler() {

      /** Serial version UID */
      private static final long serialVersionUID = 1L;
      private DataFlavor df =
            new DataFlavor("application/x-java-jvm-local-objectref;"
                  + "class=javax.swing.JInternalFrame", "Internal Frame");

      @Override
      public boolean canImport(TransferSupport support) {
        System.out.println(df);
        System.out.println(Arrays.asList(support.getDataFlavors()));
        return support.isDataFlavorSupported(df) && support.isDrop();
      }

      @Override
      public boolean importData(TransferSupport support) {
        try {
          ((JLabel) support.getComponent()).setText(((JInternalFrame) support
                .getTransferable().getTransferData(df)).getTitle()
                + " dropped.");
          return true;
        } catch (Exception ex) {
          ex.printStackTrace();
          ((JLabel) support.getComponent()).setText(ex.getMessage());
          return false;
        }
      }
    });

    /* test ui */
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(desktopPane);
    contentPane.add(dropContainer, BorderLayout.LINE_END);

    final JFrame f = new JFrame("Test Frame: JInternalFrameDnDTestGui"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
Ebenius
 

Tine2

Mitglied
Super, vielen Dank, das hilft mir wirklich sehr!
Das geht auf jeden Fall in die Richtung! Werde mir den Code mal genau anschauen und dann versuchen, das ganze auf meine Anwendung anzuwenden!
Ich denke damit werde ich es hinbekommen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
L LookAndFeel JInternalFrame aussehen isSelected() true vs false AWT, Swing, JavaFX & SWT 0
X JInternalFrame vor Java2D-Zeichnung langsam bzw. Gui friert ein AWT, Swing, JavaFX & SWT 1
G Swing JInternalFrame AWT, Swing, JavaFX & SWT 0
R Custome TitlePane JInternalFrame - ControlButton AWT, Swing, JavaFX & SWT 2
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
J Swing JInternalFrame modal setzen? AWT, Swing, JavaFX & SWT 13
J Swing JInternalFrame schließen ändern? AWT, Swing, JavaFX & SWT 7
J Swing Fokus JInternalFrame fehlerhaft AWT, Swing, JavaFX & SWT 4
G JInternalframe geöffnet oder nicht? AWT, Swing, JavaFX & SWT 4
G Swing und MDI mit JInternalFrame AWT, Swing, JavaFX & SWT 11
H Swing JInternalFrame, JDesktopPane und ein BorderLayout AWT, Swing, JavaFX & SWT 2
R Problem beim Anzeigen von Bildern auf JInternalFrame AWT, Swing, JavaFX & SWT 6
eskimo328 Java6 Methode in Java5 verwenden (memory leak JInternalFrame) AWT, Swing, JavaFX & SWT 4
A Swing getInsets() JInternalFrame AWT, Swing, JavaFX & SWT 2
R Swing JInternalFrame Opaque AWT, Swing, JavaFX & SWT 6
M JInternalFrame - Handhabung? AWT, Swing, JavaFX & SWT 5
algorismi JInternalframe Icon AWT, Swing, JavaFX & SWT 14
S JInternalFrame oder JTextArea neu laden AWT, Swing, JavaFX & SWT 2
V JInternalFrame wird überzeichnet AWT, Swing, JavaFX & SWT 8
T Neuen JInternalFrame von JLabel "herunterziehen" AWT, Swing, JavaFX & SWT 6
O Swing JInternalFrame komplett neu laden AWT, Swing, JavaFX & SWT 3
B JInternalFrame - Maximieren AWT, Swing, JavaFX & SWT 11
X Grafikfehler mit JInternalFrame (Überlagerungen) AWT, Swing, JavaFX & SWT 2
B Swing Image als Hintergrund im JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
J Swing JInternalFrame - mit DesktopManager maximieren AWT, Swing, JavaFX & SWT 3
J Swing JInternalFrame - Bug: getDesktopManager.deiconify(...) AWT, Swing, JavaFX & SWT 2
W JInternalFrame + JList Problem AWT, Swing, JavaFX & SWT 5
H Swing JInternalFrame aus JFrame ziehen AWT, Swing, JavaFX & SWT 6
N JInternalFrame minimieren und schließen AWT, Swing, JavaFX & SWT 2
T JFrame als JInternalFrame darstellen AWT, Swing, JavaFX & SWT 2
K Swing JInternalFrame und LayoutManager AWT, Swing, JavaFX & SWT 6
C Zeichnen über JInternalFrame der ICEpdf-Dokument anzeigt AWT, Swing, JavaFX & SWT 3
T Aussehen von JFrame bzw JInternalFrame ändern... wie? AWT, Swing, JavaFX & SWT 23
J Swing JInternalFrame AWT, Swing, JavaFX & SWT 5
S Swing JInternalFrame: Mehrere Probleme AWT, Swing, JavaFX & SWT 3
S Swing JInternalFrame: Titelleiste entfernen AWT, Swing, JavaFX & SWT 5
R Swing JFrame oder JInternalFrame? AWT, Swing, JavaFX & SWT 13
B JInternalFrame resize event AWT, Swing, JavaFX & SWT 2
X JInternalFrame AWT, Swing, JavaFX & SWT 3
G JInternalFrame AWT, Swing, JavaFX & SWT 2
W JInternalFrame alleine funktionsfähig AWT, Swing, JavaFX & SWT 5
A JSplitPane in JInternalFrame AWT, Swing, JavaFX & SWT 2
G JInternalFrame und beinhaltende Komponenten 'abschalten' AWT, Swing, JavaFX & SWT 2
K Tab von JPanel nach JInternalFrame AWT, Swing, JavaFX & SWT 2
M JInternalFrame Titel sichtbar setzen AWT, Swing, JavaFX & SWT 2
K JInternalFrame - schwarzer Bildschirm AWT, Swing, JavaFX & SWT 2
M JInternalFrame ohne Titelbalken AWT, Swing, JavaFX & SWT 5
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
S Kontextmenu im JInternalFrame unterdrücken AWT, Swing, JavaFX & SWT 5
G Layerproblem JInternalFrame AWT, Swing, JavaFX & SWT 2
X Externe Anwendungen in JInternalframe starten. AWT, Swing, JavaFX & SWT 5
T JInternalFrame Vollbild Problem AWT, Swing, JavaFX & SWT 4
X Relative positionierung in einem JInternalFrame AWT, Swing, JavaFX & SWT 3
J JInternalFrame "schimmert" durch AWT, Swing, JavaFX & SWT 4
D JInternalFrame iconified Position nach parent-resize AWT, Swing, JavaFX & SWT 2
DeeDee0815 JInternalFrame in JScrollpane AWT, Swing, JavaFX & SWT 4
C Hilfe bei JInternalFrame AWT, Swing, JavaFX & SWT 6
J JInternalFrame überlagert/unterlagert anderen Elementen AWT, Swing, JavaFX & SWT 2
DeeDee0815 setContentPane()-Problem bei JInternalFrame AWT, Swing, JavaFX & SWT 2
W Unterdrückung von FrameIcon-Funktion im JInternalFrame AWT, Swing, JavaFX & SWT 5
F JInternalFrame Look and Feel AWT, Swing, JavaFX & SWT 3
W Realisierung Gradient in der Titlebar JInternalFrame AWT, Swing, JavaFX & SWT 7
T JInternalFrame Konflikt mit LayoutManager AWT, Swing, JavaFX & SWT 5
T JInternalFrame und Iconified AWT, Swing, JavaFX & SWT 10
C Tooltip nur anzeigen, wenn JInternalFrame minimiert AWT, Swing, JavaFX & SWT 3
M JInternalFrame mouseEntered/mouseExited AWT, Swing, JavaFX & SWT 8
S Eine Art JInternalFrame in JSplitPane AWT, Swing, JavaFX & SWT 3
G Problem bei JTable in JInternalFrame AWT, Swing, JavaFX & SWT 4
megachucky JInternalFrame modal setzen AWT, Swing, JavaFX & SWT 3
megachucky JInternalFrame Größe und Location nicht einstellbar AWT, Swing, JavaFX & SWT 8
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
R Rückgabewert TreeSelectionListener für JInternalFrame AWT, Swing, JavaFX & SWT 4
J Applet in JInternalFrame laden AWT, Swing, JavaFX & SWT 9
B JInternalFrame in den Vordergrund rücken + Focus AWT, Swing, JavaFX & SWT 15
F Anzeigen eines JInternalFrame auf einen JFrame AWT, Swing, JavaFX & SWT 3
B JInternal Frame laden von anderem JInternalFrame AWT, Swing, JavaFX & SWT 3
A JInternalFrame setMaximizeable(false) wehrt sich AWT, Swing, JavaFX & SWT 2
S JInternalFrame AWT, Swing, JavaFX & SWT 8
welterde Menü in der Titelleiste des JInternalFrame AWT, Swing, JavaFX & SWT 4
S Problem, neuen JInternalFrame zur Laufzeit anzuzeigen AWT, Swing, JavaFX & SWT 8
M Cursor im deaktivierten JInternalFrame AWT, Swing, JavaFX & SWT 2
V JInternalFrame in einen Panel? AWT, Swing, JavaFX & SWT 2
C Scrollbalken bei einem JInternalFrame AWT, Swing, JavaFX & SWT 6
G JInternalFrame mit Doppelklick schließen möglich? AWT, Swing, JavaFX & SWT 2
D JInternalFrame unverschiebbar AWT, Swing, JavaFX & SWT 7
G JInternalFrame Fenster Status von Icon nach Normal? AWT, Swing, JavaFX & SWT 5
G lightweight >> heavyweight bei JInternalFrame für JMen AWT, Swing, JavaFX & SWT 13
P JInternalFrame: Verhindern das man es verschieben kann AWT, Swing, JavaFX & SWT 2
K JInternalFrame: internes Fenster zentrieren AWT, Swing, JavaFX & SWT 2
D JInternalFrame beim Öffnen nicht aktiv! AWT, Swing, JavaFX & SWT 5
A Probleme mit JInternalFrame AWT, Swing, JavaFX & SWT 5
javasdann Höhe von Titlebar in jInternalFrame ändern AWT, Swing, JavaFX & SWT 5
S Auf Komponenten eines JInternalFrame zugreifen AWT, Swing, JavaFX & SWT 2
A Ich kann kein JInternalFrame anzeigen ! AWT, Swing, JavaFX & SWT 7
P JInternalFrame - Problem AWT, Swing, JavaFX & SWT 3
F Listener für JPanel im JInternalFrame AWT, Swing, JavaFX & SWT 5
S finalizie() bei JInternalFrame wird nicht aufgerufen ! AWT, Swing, JavaFX & SWT 11
A JInternalFrame AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben