IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Choix d'un composant


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut Choix d'un composant
    Bonjour tout le monde,

    je suis actuellement en train de développer un séquencer Audio/MIDI entièrement en Java, pour l'ihm j'ai choisi Swing. Bon ce que je dois faire ce raproche un peu de ça:



    à la différence que j'aurais un JTree a gauche depuis lequel je pourrais ajouter mes séquences par drag 'n drop dans mes pistes. Mon problème c'est que je vois pas trop quels composants je peut utiliser pour dessiner mes pistes et la représentation des séquences sonores à l'intérieur des pistes (Pour le moment un rectangle de couleur uni me suffit, j'ai pas besoin de la représentation de l'onde comme sur l'exemple que je vous ai donné). Sachant qu'en cliquant sur une séquence sonore on doit pouvoir la déplacer au sein de la piste qui la contient ou bien la déplacer dans une autre piste audio. J'ai vraiment les idées confuses donc si quelqu'un pouvait m'éclairer ça serait sympa. Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Un tel rendu peut se faire via des appels Java2D (voir classes et methodes de rendu dans java.awt, java.awt.image et java.awt.geom) dans la methode paintComponent() d'un JComponent (ou un JPanel) ou dans une BufferedImage, elle-meme affichee dans un JComponent (ou un JPanel) (ceici evite de devoir tout redessiner a chaque fois, cependant, evidement cela consomme plus de memoire). Un fois un tel composant dedie cree, tu pourras alors plancher sur le drag & drop.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    Merci pour ta réponse. J'ai utilisé des JPanels dans des JPanels et redéfini paintComponent() pour avoir le rendu approprié. Par contre je débute en ce qui concerne le D&D en Swing et si j'ai bien compris un JPanel ne gère pas le D&D par défault, et je dois donc définir un TransferHandler pour pouvoir le gérer, c'est à peu près ça ou pas du tout ?

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
     
    package test;
     
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import java.awt.datatransfer.*;
    import java.io.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.imageio.*;
    import java.awt.BorderLayout;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class TestDnDContainer extends JPanel {
     
      public TestDnDContainer() {
        setTransferHandler(new DnDHandler());
        DnDMouseListener listener = new DnDMouseListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
        setLayout(new FlowLayout());
        //setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
        int childNumber = Math.max(1, (int) (10 * Math.random()));
        System.out.printf("Creating %d sub-panels\n", childNumber);
        for (int i = 0; i < childNumber; i++) {
          add(new SignalPanel());
        }
        System.out.printf("Contains %d children\n", getComponentCount());
      }
     
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
            frame.add(new TestDnDContainer());
            frame.add(new TestDnDContainer());
            frame.pack();
            frame.setVisible(true);
          }
        });
      }
     
      private static class SignalPanel extends JPanel {
        private static int ID = 0;
        private int id = ID++;
     
        private static final Color[] COLORS = {Color.RED, Color.BLUE, Color.YELLOW, Color.ORANGE, Color.MAGENTA, Color.GREEN, Color.PINK, Color.WHITE, Color.DARK_GRAY, Color.CYAN};
     
        public SignalPanel() {
          setBackground(COLORS[(int) (COLORS.length * Math.random())]);
          setMinimumSize(new Dimension(50, 50));
          setPreferredSize(new Dimension(50, 50));
        }
     
        protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.setColor(Color.BLACK);
          g.drawString(String.valueOf(id), 10, 10);
        }
      }
     
     
      private SignalPanel selectedPanel;
     
      private class DnDMouseListener extends MouseInputAdapter {
        MouseEvent firstMouseEvent = null;
     
        public void mousePressed(MouseEvent e) {
          //Don't bother to drag if there is no sub-component.
          if (getComponentCount() == 0) {
            return;
          }
          Component component = getComponentAt(e.getX(), e.getY());
          if (!(component instanceof SignalPanel)) {
            return;
          }
          selectedPanel = (SignalPanel) component;
          System.out.println("Mouse pressed");
          firstMouseEvent = e;
          e.consume();
        }
     
        public void mouseDragged(MouseEvent e) {
          //Don't bother to drag if there is no sub-component.
          if (getComponentCount() == 0) {
            return;
          }
          System.out.println("Mouse dragged");
          if (firstMouseEvent != null) {
            e.consume();
     
            //If they are holding down the control key, COPY rather than MOVE
            int ctrlMask = InputEvent.CTRL_DOWN_MASK;
            int action = ((e.getModifiersEx() & ctrlMask) == ctrlMask) ? TransferHandler.COPY : TransferHandler.MOVE;
     
            int dx = Math.abs(e.getX() - firstMouseEvent.getX());
            int dy = Math.abs(e.getY() - firstMouseEvent.getY());
            //Arbitrarily define a 5-pixel shift as the
            //official beginning of a drag.
            if (dx > 5 || dy > 5) {
              //This is a drag, not a click.
              JComponent c = (JComponent) e.getSource();
              //Tell the transfer handler to initiate the drag.
              TransferHandler handler = c.getTransferHandler();
              handler.exportAsDrag(c, firstMouseEvent, action);
              firstMouseEvent = null;
            }
          }
        }
     
        public void mouseReleased(MouseEvent e) {
          System.out.println("Mouse released");
          firstMouseEvent = null;
        }
      }
     
     
      private static class DnDHandler extends TransferHandler {
        private DataFlavor signalFlavor = new DataFlavor(SignalPanel.class, "Draggable signal renderer");
     
        private TestDnDContainer sourcePanel;
     
        boolean shouldRemove;
     
        /** This is called in the transfert handler of the receiver.
         */
        public boolean importData(JComponent c, Transferable t) {
          SignalPanel signalPanel;
          if (canImport(c, t.getTransferDataFlavors())) {
            TestDnDContainer targetPanel = (TestDnDContainer) c;
            //Don't drop on myself.
            if (sourcePanel == targetPanel) {
              shouldRemove = false;
              return true;
            }
            try {
              signalPanel = (SignalPanel) t.getTransferData(signalFlavor);
              if (sourcePanel == null) {
              }
              targetPanel.add(signalPanel);
              targetPanel.revalidate();
              targetPanel.repaint();
              for (int i = 0; i < targetPanel.getComponentCount(); i++) {
                System.out.print(((SignalPanel) targetPanel.getComponent(i)).id + "\t");
              }
              System.out.println();
              return true;
            }
            catch (UnsupportedFlavorException ufe) {
              System.out.println("importData: unsupported data flavor");
            }
            catch (IOException ioe) {
              System.out.println("importData: I/O exception");
            }
            catch (Throwable th) {
              th.printStackTrace();
            }
          }
          return false;
        }
     
        protected Transferable createTransferable(JComponent c) {
          sourcePanel = (TestDnDContainer) c;
          SignalPanel signalPanel = sourcePanel.selectedPanel;
          shouldRemove = true;
          return new SignalTransferable(signalPanel);
        }
     
        public int getSourceActions(JComponent c) {
          return COPY_OR_MOVE;
        }
     
        /** This is called in the transfert handler of the sender.
         */
        protected void exportDone(JComponent c, Transferable data, int action) {
          if (shouldRemove && (action == MOVE)) {
            sourcePanel.remove(sourcePanel.selectedPanel);
            sourcePanel.revalidate();
            sourcePanel.repaint();
            sourcePanel.selectedPanel = null;
            for (int i = 0; i < sourcePanel.getComponentCount(); i++) {
              System.out.print(((SignalPanel) sourcePanel.getComponent(i)).id + "\t");
            }
            System.out.println();
          }
          sourcePanel = null;
        }
     
        public boolean canImport(JComponent c, DataFlavor[] flavors) {
          for (int i = 0; i < flavors.length; i++) {
            if (signalFlavor.equals(flavors[i])) {
              return true;
            }
          }
          return false;
        }
     
        public Icon getVisualRepresentation(Transferable t) {
          System.out.println("Creating visual representation");
          SignalTransferable st = (SignalTransferable) t;
          BufferedImage image = new BufferedImage(st.sourceSignalPanel.getWidth(), st.sourceSignalPanel.getHeight(), BufferedImage.TYPE_INT_RGB);
          Graphics graphics = image.createGraphics();
          st.sourceSignalPanel.paint(graphics);
          graphics.dispose();
          return new ImageIcon(image);
        }
     
     
        class SignalTransferable implements Transferable {
          private SignalPanel sourceSignalPanel;
     
          SignalTransferable(SignalPanel sourceSignalPanel) {
            this.sourceSignalPanel = sourceSignalPanel;
          }
     
          public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
            if (!isDataFlavorSupported(flavor)) {
              throw new UnsupportedFlavorException(flavor);
            }
            return sourceSignalPanel;
          }
     
          public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] {signalFlavor};
          }
     
          public boolean isDataFlavorSupported(DataFlavor flavor) {
            return signalFlavor.equals(flavor);
          }
        }
     
      }
    }
    Voici un exemple TRES tres rapidement programme (pas beau a voir et a lire donc) a partir des didacticiels du DnD sur le site de Sun. A noter que :

    - getVisualRepresentation() n'est jamais appele. C'est un bug connu et documente de Swing qui traine depuis 6~8 ans (peut-etre meme plus) deja. Actuellement le seul moyen de le contourne serai de dessiner manuellement une representation du panel dans le glasspane ou via quelchose de similaire.

    - ce test transfert des panels toujours a la fin. Dans ton cas tu voudras probablement les inserrer ou bon te semble. Il faudra alors detecter la position actuelle du curseur dans le panel destination via le mouseMoved() ou mouseDragged(). De meme j'ai mis ici des layout pour me faciliter le test, dans ton cas il peut etre bien d'utiliser un layout null puisque tu es sense positionne tes signaux ou bon te semble.

    - peut-etre dans ton cas preferreras-tu transferer l'objet signal plutot que son panel containeur/renderer/editor.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    Vraiment merci, ton code m'a vraiment aidé. Pour les layout pas de soucis j'étais déja en layout null. Par contre j'ai deux petites questions :

    - Pour connaitre la position du curseur au moment du drop dans le panel destination via le mouseMoved() ou mouseDragged(), je ne vois pas trop comment faire sachant que d'aprés ce que j'ai observé une fois le seuil des 5 pixels dépassé et le TransportHandler créé aucun événement n'appelle ces deux méthodes.
    - Aprés j'ai activé le D&D dans mon JTree et j'ai mis des instance SignalPanel dans les noeuds de l'abre donc normalement le TransferHandler dont je me sert pour le D&D entre panel devrait être compatible puisque le DataFlavor est le même. Mais en fait quand j'essaye de droper depuis l'abre il m'indique que c'est une zone non compatible et je comprends pas pourquoi puisque j'essaye de droper le bon type dedans.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Aille ca peut etre genant effectivement pour la souris. Je n'ai pas trop le temps de tester la chose manuellement.

    Pour le second probleme, il faudrai voir ce que fait la methode equals() de DataFlavor, quitte a aller voir ce qui se passe dedans en mode debug.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         public boolean isDataFlavorSupported(DataFlavor flavor) {
            return signalFlavor.equals(flavor);
          }
    Citation Envoyé par javadoc
    public boolean equals(DataFlavor that)

    Tests a DataFlavor to this DataFlavor for equality. Two DataFlavors are considered equal if and only if their MIME primary type and subtype and representation class are equal. Additionally, if the primary type is "text", the subtype denotes a text flavor which supports the charset parameter, and the representation class is not java.io.Reader, java.lang.String, java.nio.CharBuffer, or [C, the charset parameter must also be equal. If a charset is not explicitly specified for one or both DataFlavors, the platform default encoding is assumed. See selectBestTextFlavor for a list of text flavors which support the charset parameter.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Choix d'un composant graphique pour afficher un tableau
    Par Latimer dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/11/2014, 14h13
  2. [Composant] Choix de la classe ancêtre
    Par Clorish dans le forum Composants VCL
    Réponses: 11
    Dernier message: 12/08/2004, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo