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

Composants Java Discussion :

[ComboBoxEditor][JOptionPane] propagation innatendue d'evenement


Sujet :

Composants Java

  1. #1
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut [ComboBoxEditor][JOptionPane] propagation innatendue d'evenement
    Je me suis code dernierement une boite de selection de police de characteres comme on peut en trouver dans nombre de logiciels. De maniere a eviter que l'utilisateur ne puisse entrer une taille de police fantaisiste (chaine de texte ou nombre flottant au lieu d'entier) dans la JComboBox size j'y ai mi un ComboBoxEditor perso base sur un JFormattedTextField.

    Jusque-la pas de probleme ; j'ai de plus commence un test qui s'affiche dans un JOptionPane a la maniere de JFileChooser ou JColorChooser. J'ai bien sur decider de forwarder les evenement nottament quand le JFormattedTextField valide la saisie (ce qui arrive generalement apres la perte du focus). Or la il se passe un truc bizarre si je fais un fireActionPerformed()() a la reception du changement de la propriete "value" : la boite de dialogue se ferme automatiquement...

    Etrange d'autant plus que je n'ai aucune interraction avec le JOptionPane. Or bien sur quand la JComboBox a son editeur par defaut le probleme ne survient pas... J'ai eut beau fouiller dans les sources des UI par default (Basic et Metal) je ne vois pas trop ce qui est different dans les editeurs par defaut et dans le mien.

    J'ai alors mis en place le second test avec une JFrame pour verifier que la propagation de l'evement influe bien sur le changement de police de la zone de preview et c'est effectivement le cas (difficile a verifier puisque le JOptionPane se ferme automatiquement). Donc la, je ne vois pas trop d'ou ca vient.

    Note : dans mon code suivant, mon editeur delegue a un JFormattedTextField, le probleme survient egalement quand mon editeur etend directement JFormattedTextField.

    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
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
     
    /***********************************************************************
     *  Copyright - Secretariat of the Pacific Community                   *
     *  Droit de copie - Secretariat Général de la Communauté du Pacifique *
     *  http://www.spc.int/                                                *
     ***********************************************************************/
    package org.spc.ofp.gui;
     
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Font;
    import java.awt.GraphicsEnvironment;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.text.NumberFormat;
    import javax.swing.ComboBoxEditor;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.event.EventListenerList;
    import javax.swing.text.NumberFormatter;
    import org.jdesktop.swingx.JXPanel;
     
    /**
     *
     * @author  fabriceb
     */
    public class FontChooser extends JXPanel {
     
      private static final long serialVersionUID = 1l;
      /**
       * The user selected font.
       */
      public static final String SELECTED_FONT_PROPERTY = "selectedFont";
      /** 
       * Default font sizes.
       */
      private static final int[] DEFAULT_SIZE = {8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
      /** 
       * Editing flag.
       */
      private boolean isEditing;
     
      /** 
       * Creates instance with default font.
       */
      public FontChooser() {
        this(null);
      }
     
      /** 
       * Creates instance with given font.
       * @param font The font.
       */
      public FontChooser(Font font) {
        super();
        initComponents();
        //
        isEditing = true;
        String[] families = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        DefaultComboBoxModel familyModel = (DefaultComboBoxModel) familyCombo.getModel();
        for (String family : families) {
          familyModel.addElement(family);
        }
        DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
        for (int size : DEFAULT_SIZE) {
          sizeModel.addElement(size);
        }
        isEditing = false;
        //
        setSelectedFont(font);
      }
     
      /**
       * Sets the selected <code>Font</code>.
       * @param value The new value.
       * <br/>If <code>null</code> uses the default font of this component instead.
       * @see #getSelectedFont() 
       */
      public void setSelectedFont(Font value) {
        if (value == null) {
          value = getFont();
        }
        putClientProperty(SELECTED_FONT_PROPERTY, value);
        isEditing = true;
        familyCombo.setSelectedItem(value.getFamily());
        sizeCombo.setSelectedItem(value.getSize());
        boldButton.setSelected(value.isBold());
        italicButton.setSelected(value.isItalic());
        previewArea.setFont(value);
        isEditing = false;
      }
     
      /**
       * Gets the selected <code>Font</code>.
       * @return A <code>Font</code> instance, never <code>null</code>.
       * @see #setSelectedFont(java.awt.Font) 
       */
      public Font getSelectedFont() {
        return (Font)getClientProperty(SELECTED_FONT_PROPERTY);
      }
     
      protected void applyNewFont() {
        String family = (String) familyCombo.getSelectedItem();
        int size = ((Number) sizeCombo.getSelectedItem()).intValue();
        int style = boldButton.isSelected() ? Font.BOLD : Font.PLAIN;
        style = italicButton.isSelected() ? style | Font.ITALIC : style;
        Font font = new Font(family, style, size);
        putClientProperty(SELECTED_FONT_PROPERTY, font);
        previewArea.setFont(font);
      }
     
      /** 
       * Self-test main.
       * @param args Arguments from the command line.
       */
      public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
     
          /**
           * {@inheritDoc}
           */
          @Override
          public void run() {
            try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              JFrame frame = new JFrame("Test");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new BorderLayout());
              frame.add(new FontChooser(), BorderLayout.CENTER);
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
              JOptionPane.showMessageDialog(null, new FontChooser());
            }
            catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
      }
     
      /**
       * A combo box editor that only accepts integers.
       * @author  fabriceb
       */
      private class SizeComboBoxEditor implements ComboBoxEditor, PropertyChangeListener {
     
        private JFormattedTextField delegated = new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));
        private EventListenerList listenerList = new EventListenerList();
     
        /**
         * Creates a new instance.
         */
        public SizeComboBoxEditor() {
          delegated.addPropertyChangeListener("value", this);
          delegated.setBorder(null);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public Component getEditorComponent() {
          return delegated;
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void selectAll() {
          delegated.selectAll();
          delegated.requestFocus();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void setItem(Object anObject) {
          if (delegated.getValue() == null || !delegated.getValue().equals(anObject)) {
            delegated.setValue(anObject);
          }
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public Object getItem() {
          return delegated.getValue();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void addActionListener(ActionListener l) {
          listenerList.add(ActionListener.class, l);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void removeActionListener(ActionListener l) {
          listenerList.remove(ActionListener.class, l);
        }
     
        protected void fireActionEvent(Integer value) {
          Object listeners[] = listenerList.getListenerList();
          ActionEvent actionEvent = null;
          for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ActionListener.class) {
              // Lazily create the event.
              if (actionEvent == null) {
                actionEvent = new ActionEvent(delegated, ActionEvent.ACTION_PERFORMED, String.valueOf(value));
              }
              ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
            }
          }
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void propertyChange(PropertyChangeEvent event) {
          if (!isEditing) {
            Object value = delegated.getValue();
            if (value == null) {
              return;
            }
            int val = ((Number) value).intValue();
            System.out.println("Should forward " + value);
            fireActionEvent(val);
          }
        }
      }
     
      /** This method is called from within the constructor to
       * initialize the form.
       * WARNING: Do NOT modify this code. The content of this method is
       * always regenerated by the Form Editor.
       */
      @SuppressWarnings("unchecked")
      // <editor-fold defaultstate="collapsed" desc="Generated Code">
      private void initComponents() {
     
        familyLabel = new org.jdesktop.swingx.JXLabel();
        previewScroll = new javax.swing.JScrollPane();
        previewArea = new javax.swing.JTextArea();
        familyCombo = new javax.swing.JComboBox();
        previewSeparator = new org.jdesktop.swingx.JXTitledSeparator();
        boldButton = new javax.swing.JToggleButton();
        italicButton = new javax.swing.JToggleButton();
        sizeLabel = new org.jdesktop.swingx.JXLabel();
        sizeCombo = new javax.swing.JComboBox();
        styleLabel = new org.jdesktop.swingx.JXLabel();
     
        setName("Form"); // NOI18N
     
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(org.spc.ofp.seapodym.view.SeapodymViewApp.class).getContext().getResourceMap(FontChooser.class);
        familyLabel.setText(resourceMap.getString("familyLabel.text")); // NOI18N
        familyLabel.setName("familyLabel"); // NOI18N
     
        previewScroll.setName("previewScroll"); // NOI18N
     
        previewArea.setColumns(20);
        previewArea.setEditable(false);
        previewArea.setLineWrap(true);
        previewArea.setRows(5);
        previewArea.setText(resourceMap.getString("previewArea.text")); // NOI18N
        previewArea.setName("previewArea"); // NOI18N
        previewScroll.setViewportView(previewArea);
     
        familyCombo.setModel(new javax.swing.DefaultComboBoxModel());
        familyCombo.setName("familyCombo"); // NOI18N
        familyCombo.addItemListener(new java.awt.event.ItemListener() {
          public void itemStateChanged(java.awt.event.ItemEvent evt) {
            familyComboItemStateChanged(evt);
          }
        });
     
        previewSeparator.setTitle(resourceMap.getString("previewSeparator.title")); // NOI18N
        previewSeparator.setName("previewSeparator"); // NOI18N
     
        boldButton.setText(resourceMap.getString("boldButton.text")); // NOI18N
        boldButton.setToolTipText(resourceMap.getString("boldButton.toolTipText")); // NOI18N
        boldButton.setName("boldButton"); // NOI18N
        boldButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            boldButtonActionPerformed(evt);
          }
        });
     
        italicButton.setText(resourceMap.getString("italicButton.text")); // NOI18N
        italicButton.setToolTipText(resourceMap.getString("italicButton.toolTipText")); // NOI18N
        italicButton.setName("italicButton"); // NOI18N
        italicButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            italicButtonActionPerformed(evt);
          }
        });
     
        sizeLabel.setText(resourceMap.getString("sizeLabel.text")); // NOI18N
        sizeLabel.setName("sizeLabel"); // NOI18N
     
        sizeCombo.setEditable(true);
        sizeCombo.setModel(new javax.swing.DefaultComboBoxModel());
        sizeCombo.setEditor(new SizeComboBoxEditor());
        sizeCombo.setName("sizeCombo"); // NOI18N
        sizeCombo.addItemListener(new java.awt.event.ItemListener() {
          public void itemStateChanged(java.awt.event.ItemEvent evt) {
            sizeComboItemStateChanged(evt);
          }
        });
     
        styleLabel.setText(resourceMap.getString("styleLabel.text")); // NOI18N
        styleLabel.setName("styleLabel"); // NOI18N
     
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
              .addComponent(previewScroll, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
              .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                .addComponent(familyLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(familyCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(sizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(sizeCombo, 0, 73, Short.MAX_VALUE))
              .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                .addComponent(styleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(boldButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(italicButton))
              .addComponent(previewSeparator, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE))
            .addContainerGap())
        );
        layout.setVerticalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(familyLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(sizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(familyCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(sizeCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
              .addComponent(boldButton, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(styleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(italicButton, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(previewSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(previewScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)
            .addContainerGap())
        );
      }// </editor-fold>
     
    private void familyComboItemStateChanged(java.awt.event.ItemEvent evt) {                                             
    // TODO add your handling code here:
      if (!isEditing && evt.getStateChange() == ItemEvent.SELECTED) {
        applyNewFont();
      }
    }                                            
     
    private void sizeComboItemStateChanged(java.awt.event.ItemEvent evt) {                                           
    // TODO add your handling code here:
      if (!isEditing && evt.getStateChange() == ItemEvent.SELECTED) {
        Object value = sizeCombo.getSelectedItem();
        System.out.println("Received " + value + "\t" + value.getClass());
        if ((value instanceof Integer) || (value instanceof Long)) {
          int size = ((Number) value).intValue();
          DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
          int sizeCount = sizeModel.getSize();
          for (int i = 0; i <
            sizeCount; i++) {
            int val = ((Number) sizeModel.getElementAt(i)).intValue();
            // Value already in combo.
            if (size == val) {
              break;
            }
            // Insert before current value.
            else if (val > size) {
              sizeModel.insertElementAt(size, i);
              break;
            }
            // Add at end.
            else if (i == sizeCount - 1) {
              sizeModel.addElement(size);
              break;
            }
          }
          applyNewFont();
        }
      }
    }                                          
     
    private void boldButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
      if (!isEditing) {
        applyNewFont();
      }
    }                                          
     
    private void italicButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    // TODO add your handling code here:
      if (!isEditing) {
        applyNewFont();
      }
    }                                            
      // Variables declaration - do not modify
      private javax.swing.JToggleButton boldButton;
      private javax.swing.JComboBox familyCombo;
      private org.jdesktop.swingx.JXLabel familyLabel;
      private javax.swing.JToggleButton italicButton;
      private javax.swing.JTextArea previewArea;
      private javax.swing.JScrollPane previewScroll;
      private org.jdesktop.swingx.JXTitledSeparator previewSeparator;
      private javax.swing.JComboBox sizeCombo;
      private org.jdesktop.swingx.JXLabel sizeLabel;
      private org.jdesktop.swingx.JXLabel styleLabel;
      // End of variables declaration
      }
    Evidement si on commente le fireActionPerformed(), le probleme ne survient plus lors de la perte du focus mais en contrepartie, la propagation de la taille ne se fait plus trop.................

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Je vais peut être dire une bêtise, mais le comportement par défaut d'un ACTION_PERFORMED issu d'une boite de dialogue n'est-il pas de fermer cette boite de dialogue ?

    ... sinon j'ai un peu de mal à suivre dans ton code, à cause des JX... dedans et donc je peux pas jouer avec... (à moins que je n'installe SwingX juste pour ça).... Si tu pouvais faire une version sans SwingX ?

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Sauf que... sauf que l'actionPerformed ne devrait etre intercepte que par la JComboBox manipulant cet editor. Cet evenement ne devrait jamais sortir du composant et au pire des cas, le JXPanel parent se trouve entre elle et la boite de dialogue. C'est un peu comme si les actionPerformed() des boutons permettant de mettre en gras ou en italiques provoquaient egalement la fermeture de la fenetre .

    Pour le reste c'est assez facile vu que je n'ai encore utilise aucun Painter :

    JXPanel => JPanel
    JXLabel => JLabel
    JXTitledSeparator => JLabel

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Et les org.jdesktop.swingx ? Et les org.jdesktop.swingx.JXTitledSeparator ? Et les org.jdesktop.application.ResourceMap ?

    ... tu as l'air d'avoir réussi à bien intégrer SwingX à Netbeans d'ailleurs, c'est pas mal... je vais peut être retenter le coup un jour... Moi j'avais réussi il y a longtemps, malheureusement j'étais obligé à l'époque de garder la même version de SwingX pour tous mes projets, et comme le projet swingx sort une nouvelle version toutes les deux minutes... (et moi des miens une fois tous les 6 mois...) ça collait pas avec mes impératifs.

    Mais ça ne répond pas à ta question, je le reconnais

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Ah oui j'oubliais cette salo#@$@ de form designer de Netbeans...
    Ce n'est pas grave. Tout ce qui est SwingX peut etre vire (donc un JXTitledSeparator peut etre remplace par un JLabel - ce n'est rien de plus qu'un JLabel double d'un JSeparator).

    Pour org.jdesktop.application.ResourceMap, si tu as NetBeans il devrait suffire de rajouter le Swing Application Framework a ton projet (la franchement c'est Netbeans qui a tout fait tout seul et comme j'ai utilise une form JPanel ce code a ete genere automatiquement) mais il est vrai que pour une raison bizarre, il l'a lie a la classe d'application de mon programme (qui derive de cette JSR). Bah, au pire des cas il doit etre tres rapide de le remplacer... par un simple ResourceBundle (ben vi c'est juste ca), voir carrement de supprimer toutes les donnees i18n.

    Pour rajouter SwingX a Netbeans j'ai trouve ca tres simple (bien plus que Maven ou Geotools qui ne fonctionnent toujours pas chez moi) : j'ai cree une nouvelle lib SwingX pointant sur le gros JAR de SwingX + delui de JXLayer avec les bon path vers les sources et la doc.
    Puis j'ai rajoute les composants dans la palette de Netbeans via le PaletteManager en creant une nouvelle categorie puis en faisant Add from JAR... et en choisisant manuellement les JXComponent a inclure en choisissant Show All JavaBeans (en effet une partie des composants ne disposent pas de classes beaninfo propres et donc ne sont pas listes quand on reste sur l'option Show Marked Javabeans).
    Bref c'est du tout simple et du tout cuit et on se demande pourquoi ou comment ils n'ont toujours pas ete foutus de pondre un didactiel sur leur site/wiki expliquant comment faire.

    Sinon pour faire une forme JXPanel, il suffit de faire une forme JPanel, de changer le extends JPanel dans le code en extends JXPanel puis de fermer et reouvrir la classe et voila ! Bref c'est pas complique pour un sou...

    Mais effectivement cela ne resoud pas le probleme

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Et sinon en cas de besoin voici les fichiers complementaires :

    FontChooser.properties (places dans le sous-package resources par le form designer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    sizeLabel.text=Size
    familyLabel.text=Family
    boldButton.text=
    italicButton.text=
    styleLabel.text=Style
    previewSeparator.title=Preview
    previewArea.text=abcdefghijklmnopqrstuvwxyz\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n1234567890.:,;()[]{}<>/\+-*=!?_'"@#$%^%&\nThe quick brown fox jumps over the lazy dog. 1234567890
    boldButton.toolTipText=<html>Sets the font to <b>bold</b>.</html>
    italicButton.toolTipText=<html>Sets the font to <b>italic</b>.</html>
    FontChooser.form (dans le meme package que la FontChooser.java)
    Code XML : 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
     
    <?xml version="1.0" encoding="UTF-8" ?>
     
    <Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
      <Properties>
        <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
      </Properties>
      <AuxValues>
        <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
        <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
        <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
        <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
        <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
        <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
        <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
        <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
      </AuxValues>
     
      <Layout>
        <DimensionLayout dim="0">
          <Group type="103" groupAlignment="0" attributes="0">
              <Group type="102" alignment="1" attributes="0">
                  <EmptySpace max="-2" attributes="0"/>
                  <Group type="103" groupAlignment="1" attributes="0">
                      <Component id="previewScroll" alignment="0" pref="376" max="32767" attributes="0"/>
                      <Group type="102" alignment="0" attributes="1">
                          <Component id="familyLabel" min="-2" max="-2" attributes="0"/>
                          <EmptySpace max="-2" attributes="0"/>
                          <Component id="familyCombo" min="-2" pref="242" max="-2" attributes="0"/>
                          <EmptySpace max="-2" attributes="0"/>
                          <Component id="sizeLabel" min="-2" max="-2" attributes="0"/>
                          <EmptySpace max="-2" attributes="0"/>
                          <Component id="sizeCombo" pref="73" max="32767" attributes="0"/>
                      </Group>
                      <Group type="102" alignment="0" attributes="0">
                          <Component id="styleLabel" min="-2" max="-2" attributes="0"/>
                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
                          <Component id="boldButton" min="-2" max="-2" attributes="0"/>
                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
                          <Component id="italicButton" min="-2" max="-2" attributes="0"/>
                      </Group>
                      <Component id="previewSeparator" alignment="0" pref="376" max="32767" attributes="0"/>
                  </Group>
                  <EmptySpace max="-2" attributes="0"/>
              </Group>
          </Group>
        </DimensionLayout>
        <DimensionLayout dim="1">
          <Group type="103" groupAlignment="0" attributes="0">
              <Group type="102" alignment="0" attributes="0">
                  <EmptySpace max="-2" attributes="0"/>
                  <Group type="103" groupAlignment="3" attributes="0">
                      <Component id="familyLabel" alignment="3" min="-2" max="-2" attributes="0"/>
                      <Component id="sizeLabel" alignment="3" min="-2" max="-2" attributes="0"/>
                      <Component id="familyCombo" alignment="3" min="-2" max="-2" attributes="0"/>
                      <Component id="sizeCombo" alignment="3" min="-2" max="-2" attributes="0"/>
                  </Group>
                  <EmptySpace max="-2" attributes="0"/>
                  <Group type="103" groupAlignment="1" attributes="0">
                      <Component id="boldButton" alignment="1" min="-2" pref="9" max="-2" attributes="0"/>
                      <Component id="styleLabel" alignment="1" min="-2" max="-2" attributes="0"/>
                      <Component id="italicButton" min="-2" pref="9" max="-2" attributes="0"/>
                  </Group>
                  <EmptySpace max="-2" attributes="0"/>
                  <Component id="previewSeparator" min="-2" max="-2" attributes="0"/>
                  <EmptySpace max="-2" attributes="0"/>
                  <Component id="previewScroll" pref="155" max="32767" attributes="0"/>
                  <EmptySpace max="-2" attributes="0"/>
              </Group>
          </Group>
        </DimensionLayout>
      </Layout>
      <SubComponents>
        <Component class="org.jdesktop.swingx.JXLabel" name="familyLabel">
          <Properties>
            <Property name="text" type="java.lang.String" resourceKey="familyLabel.text"/>
            <Property name="name" type="java.lang.String" value="familyLabel" noResource="true"/>
          </Properties>
        </Component>
        <Container class="javax.swing.JScrollPane" name="previewScroll">
          <Properties>
            <Property name="name" type="java.lang.String" value="previewScroll" noResource="true"/>
          </Properties>
     
          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
          <SubComponents>
            <Component class="javax.swing.JTextArea" name="previewArea">
              <Properties>
                <Property name="columns" type="int" value="20"/>
                <Property name="editable" type="boolean" value="false"/>
                <Property name="lineWrap" type="boolean" value="true"/>
                <Property name="rows" type="int" value="5"/>
                <Property name="text" type="java.lang.String" resourceKey="previewArea.text"/>
                <Property name="name" type="java.lang.String" value="previewArea" noResource="true"/>
              </Properties>
            </Component>
          </SubComponents>
        </Container>
        <Component class="javax.swing.JComboBox" name="familyCombo">
          <Properties>
            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
              <Connection code="new javax.swing.DefaultComboBoxModel()" type="code"/>
            </Property>
            <Property name="name" type="java.lang.String" value="familyCombo" noResource="true"/>
          </Properties>
          <Events>
            <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="familyComboItemStateChanged"/>
          </Events>
        </Component>
        <Component class="org.jdesktop.swingx.JXTitledSeparator" name="previewSeparator">
          <Properties>
            <Property name="title" type="java.lang.String" resourceKey="previewSeparator.title"/>
            <Property name="name" type="java.lang.String" value="previewSeparator" noResource="true"/>
          </Properties>
        </Component>
        <Component class="javax.swing.JToggleButton" name="boldButton">
          <Properties>
            <Property name="text" type="java.lang.String" resourceKey="boldButton.text"/>
            <Property name="toolTipText" type="java.lang.String" resourceKey="boldButton.toolTipText"/>
            <Property name="name" type="java.lang.String" value="boldButton" noResource="true"/>
          </Properties>
          <Events>
            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="boldButtonActionPerformed"/>
          </Events>
        </Component>
        <Component class="javax.swing.JToggleButton" name="italicButton">
          <Properties>
            <Property name="text" type="java.lang.String" resourceKey="italicButton.text"/>
            <Property name="toolTipText" type="java.lang.String" resourceKey="italicButton.toolTipText"/>
            <Property name="name" type="java.lang.String" value="italicButton" noResource="true"/>
          </Properties>
          <Events>
            <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="italicButtonActionPerformed"/>
          </Events>
        </Component>
        <Component class="org.jdesktop.swingx.JXLabel" name="sizeLabel">
          <Properties>
            <Property name="text" type="java.lang.String" resourceKey="sizeLabel.text"/>
            <Property name="name" type="java.lang.String" value="sizeLabel" noResource="true"/>
          </Properties>
        </Component>
        <Component class="javax.swing.JComboBox" name="sizeCombo">
          <Properties>
            <Property name="editable" type="boolean" value="true"/>
            <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
              <Connection code="new javax.swing.DefaultComboBoxModel()" type="code"/>
            </Property>
            <Property name="editor" type="javax.swing.ComboBoxEditor" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
              <Connection code="new SizeComboBoxEditor()" type="code"/>
            </Property>
            <Property name="name" type="java.lang.String" value="sizeCombo" noResource="true"/>
          </Properties>
          <Events>
            <EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="sizeComboItemStateChanged"/>
          </Events>
        </Component>
        <Component class="org.jdesktop.swingx.JXLabel" name="styleLabel">
          <Properties>
            <Property name="text" type="java.lang.String" resourceKey="styleLabel.text"/>
            <Property name="name" type="java.lang.String" value="styleLabel" noResource="true"/>
          </Properties>
        </Component>
      </SubComponents>
    </Form>

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(org.spc.ofp.seapodym.view.SeapodymViewApp.class).getContext().getResourceMap(FontChooser.class);
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.ResourceBundle resourceMap = java.util.ResourceBundle.getBundle("org/spc/ofp/gui/resources/FontChooser"); // NOI18N
    pour eliminer la dependance

  8. #8
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Bon j'ai réussi à faire une version sans swingx, et quand le lance le programme, je vois deux fenêtres l'une sur l'autre : au dessus je vois "Message", en dessous "Test". Les deux fenêtres ont le même aspect, sauf que la fenêtre Test n'a pas de bouton OK. Celle du dessus a le focus.

    Celle du dessus semble être modale : même si je clic dans celle du dessous, celle du dessus garde le focus.

    Je peux manipuler celle du dessus : changer le JComboBox, la liste déroulante, mais je ne peux pas intervenir dans ce qui ressemble à un JTextPane. Si je fais OK, alors cette fenêtre disparait, le focus passe à la fenêtre Test, et je peux faire pareil avec cette dernière.

    Quel est le problème ?

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Dans la boite de dialogue (la fenetre avec le bouton Ok), dans mon cas si dans l'editeur de la JComboBox Size je saisie une valeur au clavier et que je change le focus vers un autre composant que ce soit au clavier ou a la souris*, la boite de dialogue se ferme ce qui n'est clairement pas le comportement que je veux avoir.

    *ce qui a pour effet que le JFormattedTextField contenu dans le ComboBoxEditor valide la saisie, lance un propertyChange() sur la propriete "value" qui lui-meme provoque un fireActionPerformed() a destination de la JComboBox de maniere a provoquer un itemStateChange() pour mettre a jour la JTextArea ainsi que la propriete "selectedFont" du composant.

  10. #10
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Chez moi rien de tel ne se produit. Je peux aller dans n'importe quelle JComboBox, intervenir au clavier (la combo selectionne une valeur déjà là quand c'est un nom de police, laisse faire quand c'est une taille de caractère), et je peux changer le focus par la souris ou le clavier, rien ne se ferme.

    Peut être est-ce une facétie de SwingX ?... la différence avec le programme d'origine est qu'il n'y a plus de swingx chez moi ; veux-tu que je le remette pour voir ?

    A toutes fins utiles, voici le logiciel auquel je suis parvenu :
    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
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    package zou;
     
     
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Font;
    import java.awt.GraphicsEnvironment;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ItemEvent;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.text.NumberFormat;
    import javax.swing.ComboBoxEditor;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JFormattedTextField;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.event.EventListenerList;
    import javax.swing.text.NumberFormatter;
    //import org.jdesktop.swingx.JXPanel;
     
    /**
     *
     * @author  fabriceb
     */
    //public class FontChooser extends JXPanel {
    public class FontChooser extends javax.swing.JPanel {
      private static final long serialVersionUID = 1l;
      /**
       * The user selected font.
       */
      public static final String SELECTED_FONT_PROPERTY = "selectedFont";
      /** 
       * Default font sizes.
       */
      private static final int[] DEFAULT_SIZE = {8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72};
      /** 
       * Editing flag.
       */
      private boolean isEditing;
     
      /** 
       * Creates instance with default font.
       */
      public FontChooser() {
        this(null);
      }
     
      /** 
       * Creates instance with given font.
       * @param font The font.
       */
      public FontChooser(Font font) {
        super();
        initComponents();
        //
        isEditing = true;
        String[] families = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        DefaultComboBoxModel familyModel = (DefaultComboBoxModel) familyCombo.getModel();
        for (String family : families) {
          familyModel.addElement(family);
        }
        DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
        for (int size : DEFAULT_SIZE) {
          sizeModel.addElement(size);
        }
        isEditing = false;
        //
        setSelectedFont(font);
      }
     
      /**
       * Sets the selected <code>Font</code>.
       * @param value The new value.
       * <br/>If <code>null</code> uses the default font of this component instead.
       * @see #getSelectedFont() 
       */
      public void setSelectedFont(Font value) {
        if (value == null) {
          value = getFont();
        }
        putClientProperty(SELECTED_FONT_PROPERTY, value);
        isEditing = true;
        familyCombo.setSelectedItem(value.getFamily());
        sizeCombo.setSelectedItem(value.getSize());
        boldButton.setSelected(value.isBold());
        italicButton.setSelected(value.isItalic());
        previewArea.setFont(value);
        isEditing = false;
      }
     
      /**
       * Gets the selected <code>Font</code>.
       * @return A <code>Font</code> instance, never <code>null</code>.
       * @see #setSelectedFont(java.awt.Font) 
       */
      public Font getSelectedFont() {
        return (Font)getClientProperty(SELECTED_FONT_PROPERTY);
      }
     
      protected void applyNewFont() {
        String family = (String) familyCombo.getSelectedItem();
        int size = ((Number) sizeCombo.getSelectedItem()).intValue();
        int style = boldButton.isSelected() ? Font.BOLD : Font.PLAIN;
        style = italicButton.isSelected() ? style | Font.ITALIC : style;
        Font font = new Font(family, style, size);
        putClientProperty(SELECTED_FONT_PROPERTY, font);
        previewArea.setFont(font);
      }
     
      /** 
       * Self-test main.
       * @param args Arguments from the command line.
       */
      public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
     
          /**
           * {@inheritDoc}
           */
          @Override
          public void run() {
            try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
              JFrame frame = new JFrame("Test");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setLayout(new BorderLayout());
              frame.add(new FontChooser(), BorderLayout.CENTER);
              frame.pack();
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
              JOptionPane.showMessageDialog(null, new FontChooser());
            }
            catch (Exception e) {
              e.printStackTrace();
            }
          }
        });
      }
     
      /**
       * A combo box editor that only accepts integers.
       * @author  fabriceb
       */
      private class SizeComboBoxEditor implements ComboBoxEditor, PropertyChangeListener {
     
        private JFormattedTextField delegated = new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));
        private EventListenerList listenerList = new EventListenerList();
     
        /**
         * Creates a new instance.
         */
        public SizeComboBoxEditor() {
          delegated.addPropertyChangeListener("value", this);
          delegated.setBorder(null);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public Component getEditorComponent() {
          return delegated;
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void selectAll() {
          delegated.selectAll();
          delegated.requestFocus();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void setItem(Object anObject) {
          if (delegated.getValue() == null || !delegated.getValue().equals(anObject)) {
            delegated.setValue(anObject);
          }
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public Object getItem() {
          return delegated.getValue();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void addActionListener(ActionListener l) {
          listenerList.add(ActionListener.class, l);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void removeActionListener(ActionListener l) {
          listenerList.remove(ActionListener.class, l);
        }
     
        protected void fireActionEvent(Integer value) {
          Object listeners[] = listenerList.getListenerList();
          ActionEvent actionEvent = null;
          for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ActionListener.class) {
              // Lazily create the event.
              if (actionEvent == null) {
                actionEvent = new ActionEvent(delegated, ActionEvent.ACTION_PERFORMED, String.valueOf(value));
              }
              ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
            }
          }
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void propertyChange(PropertyChangeEvent event) {
          if (!isEditing) {
            Object value = delegated.getValue();
            if (value == null) {
              return;
            }
            int val = ((Number) value).intValue();
            System.out.println("Should forward " + value);
            fireActionEvent(val);
          }
        }
      }
     
      /** This method is called from within the constructor to
       * initialize the form.
       * WARNING: Do NOT modify this code. The content of this method is
       * always regenerated by the Form Editor.
       */
      @SuppressWarnings("unchecked")
      // <editor-fold defaultstate="collapsed" desc="Generated Code">
      private void initComponents() {
     
        familyLabel = new JLabel();
        previewScroll = new javax.swing.JScrollPane();
        previewArea = new javax.swing.JTextArea();
        familyCombo = new javax.swing.JComboBox();
        previewSeparator = new JLabel();
        boldButton = new javax.swing.JToggleButton();
        italicButton = new javax.swing.JToggleButton();
        sizeLabel = new JLabel();
        sizeCombo = new javax.swing.JComboBox();
        styleLabel = new JLabel();
     
        setName("Form"); // NOI18N
     
    //    org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(org.spc.ofp.seapodym.view.SeapodymViewApp.class).getContext().getResourceMap(FontChooser.class);
    //    familyLabel.setText(resourceMap.getString("familyLabel.text")); // NOI18N
    //    familyLabel.setName("familyLabel"); // NOI18N
     
        previewScroll.setName("previewScroll"); // NOI18N
     
        previewArea.setColumns(20);
        previewArea.setEditable(false);
        previewArea.setLineWrap(true);
        previewArea.setRows(5);
    //    previewArea.setText(resourceMap.getString("previewArea.text")); // NOI18N
        previewArea.setName("previewArea"); // NOI18N
        previewScroll.setViewportView(previewArea);
     
        familyCombo.setModel(new javax.swing.DefaultComboBoxModel());
        familyCombo.setName("familyCombo"); // NOI18N
        familyCombo.addItemListener(new java.awt.event.ItemListener() {
          public void itemStateChanged(java.awt.event.ItemEvent evt) {
            familyComboItemStateChanged(evt);
          }
        });
     
    //    previewSeparator.setTitle(resourceMap.getString("previewSeparator.title")); // NOI18N
    //    previewSeparator.setName("previewSeparator"); // NOI18N
     
    //    boldButton.setText(resourceMap.getString("boldButton.text")); // NOI18N
    //    boldButton.setToolTipText(resourceMap.getString("boldButton.toolTipText")); // NOI18N
        boldButton.setName("boldButton"); // NOI18N
        boldButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            boldButtonActionPerformed(evt);
          }
        });
     
    //    italicButton.setText(resourceMap.getString("italicButton.text")); // NOI18N
    //    italicButton.setToolTipText(resourceMap.getString("italicButton.toolTipText")); // NOI18N
        italicButton.setName("italicButton"); // NOI18N
        italicButton.addActionListener(new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            italicButtonActionPerformed(evt);
          }
        });
     
    //    sizeLabel.setText(resourceMap.getString("sizeLabel.text")); // NOI18N
    //    sizeLabel.setName("sizeLabel"); // NOI18N
     
        sizeCombo.setEditable(true);
        sizeCombo.setModel(new javax.swing.DefaultComboBoxModel());
        sizeCombo.setEditor(new SizeComboBoxEditor());
        sizeCombo.setName("sizeCombo"); // NOI18N
        sizeCombo.addItemListener(new java.awt.event.ItemListener() {
          public void itemStateChanged(java.awt.event.ItemEvent evt) {
            sizeComboItemStateChanged(evt);
          }
        });
     
    //    styleLabel.setText(resourceMap.getString("styleLabel.text")); // NOI18N
    //    styleLabel.setName("styleLabel"); // NOI18N
     
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
              .addComponent(previewScroll, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
              .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                .addComponent(familyLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(familyCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 242, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(sizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(sizeCombo, 0, 73, Short.MAX_VALUE))
              .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                .addComponent(styleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(boldButton)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(italicButton))
              .addComponent(previewSeparator, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE))
            .addContainerGap())
        );
        layout.setVerticalGroup(
          layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
          .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
              .addComponent(familyLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(sizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(familyCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(sizeCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
              .addComponent(boldButton, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(styleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
              .addComponent(italicButton, javax.swing.GroupLayout.PREFERRED_SIZE, 9, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(previewSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(previewScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)
            .addContainerGap())
        );
      }// </editor-fold>
     
    private void familyComboItemStateChanged(java.awt.event.ItemEvent evt) {                                             
    // TODO add your handling code here:
      if (!isEditing && evt.getStateChange() == ItemEvent.SELECTED) {
        applyNewFont();
      }
    }                                            
     
    private void sizeComboItemStateChanged(java.awt.event.ItemEvent evt) {                                           
    // TODO add your handling code here:
      if (!isEditing && evt.getStateChange() == ItemEvent.SELECTED) {
        Object value = sizeCombo.getSelectedItem();
        System.out.println("Received " + value + "\t" + value.getClass());
        if ((value instanceof Integer) || (value instanceof Long)) {
          int size = ((Number) value).intValue();
          DefaultComboBoxModel sizeModel = (DefaultComboBoxModel) sizeCombo.getModel();
          int sizeCount = sizeModel.getSize();
          for (int i = 0; i <
            sizeCount; i++) {
            int val = ((Number) sizeModel.getElementAt(i)).intValue();
            // Value already in combo.
            if (size == val) {
              break;
            }
            // Insert before current value.
            else if (val > size) {
              sizeModel.insertElementAt(size, i);
              break;
            }
            // Add at end.
            else if (i == sizeCount - 1) {
              sizeModel.addElement(size);
              break;
            }
          }
          applyNewFont();
        }
      }
    }                                          
     
    private void boldButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
      if (!isEditing) {
        applyNewFont();
      }
    }                                          
     
    private void italicButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    // TODO add your handling code here:
      if (!isEditing) {
        applyNewFont();
      }
    }                                            
      // Variables declaration - do not modify
      private javax.swing.JToggleButton boldButton;
      private javax.swing.JComboBox familyCombo;
      private JLabel familyLabel;
      private javax.swing.JToggleButton italicButton;
      private javax.swing.JTextArea previewArea;
      private javax.swing.JScrollPane previewScroll;
      private JLabel previewSeparator;
      private javax.swing.JComboBox sizeCombo;
      private JLabel sizeLabel;
      private JLabel styleLabel;
      // End of variables declaration
      }

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Meme probleme qu'avant pour moi avec ton code : je tape 20 (par exemple) dans le champs d'edition de la JComboBox Size, je clique ailleurs, pouf! la boite de dialogue se ferme

    Le probleme n'est donc pas lie a SwingX.

    A noter un autre probleme lie a cet actionPerformed() quand on navigue avec haut et bas dans cette meme combo, le menu deroulant se referme automatiquement.

    Arf... c'est vraiment desolant que la doc soit quasiment inexistante sur comment faire son propre editor pour une combo...

  12. #12
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    J'ai réussi à reproduire le phénomène !

    Je pense que ça vient de ma première idée : il y a quelque part une confusion au niveau du ActionPerformed, qui provoque la fermeture de la JOptionPane.

    - Si je remplace cette JOptionPane par une Frame, rien ne se ferme.
    - Si je supprime le fireActionEvent de l'éditeur, rien ne se ferme
    - Si je conserve le ComboBoxEditor par défaut, rien ne se ferme.

    Tu vas me dire que tout cela est bien évident... Mais cela prouve tout de même que cela vient du SizeComboBoxEditor. Dans le ComboBoxEditor par défaut, par exemple, il n'y a aucun fireActionEvent, ce qui bien evidemment ne provoque aucune fermeture intempestive.

    Je ne suis d'ailleurs pas sûr que l'action d'éditer corresponde à un ACTION_PERFORMED, cela correspond peut être plutot à un ITEM_CHANGE ou assimilé. D'après ton code, quand tu édites, tu veux tout à la fois changer la valeur de ta combo et valider la saisie... dans le cas classique, la saisie d'une combo ne propage aucune ACTION_PERFORMED, sauf erreur ?

    Je n'ai malheureusement pas le temps d'approfondir plus avant, pour comprendre comment l'ActionEvent de ton éditeur se propage.

    Je te suggère de changer d'évènement pour propager l'info "Edition faite", ou peut être de te limiter à un évènement changement d'item sur édition dans la combo, et ne faire un ACTION_PERFORMED que lorsque on appuie sur le bouton ok.

    Désolé, mais j'ai pas le temps d'aller plus à fond.

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Vi mais... c'est ce que je pense depuis le debut (relis mes posts)

    De plus :
    Citation Envoyé par moi
    *ce qui a pour effet que le JFormattedTextField contenu dans le ComboBoxEditor valide la saisie, lance un propertyChange() sur la propriete "value" qui lui-meme provoque un fireActionPerformed() a destination de la JComboBox de maniere a provoquer un itemStateChange() pour mettre a jour la JTextArea ainsi que la propriete "selectedFont" du composant.
    De plus, les deux JToggleButton generent egalement des actionPerformed() sans pour autant fermer la boite de dialogue.

    Citation Envoyé par gifffftane
    Je te suggère de changer d'évènement pour propager l'info "Edition faite", ou peut être de te limiter à un évènement changement d'item sur édition dans la combo, et ne faire un ACTION_PERFORMED que lorsque on appuie sur le bouton ok.
    Suis d'accord... lequel ?
    L'API n'offre aucune indication et l'exploration du code source n'est pas concluante.

  14. #14
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    À ce que je comprends de mes explorations, l'un des écouteurs de l'évènement ACTION_PERFORMED est le BasicComboBoxUI$Handler, c'est à dire le machin qui fait la gestion interne du combobox.

    Le code de traitement du actionPerformed, que l'on peut trouver dans le fichier source javax.swing.plaf.basic.BasicComboBoxUI est le suivant (note les commentaires qui ne sont pas en javadoc :-)
    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
     
            //
            // ActionListener
            //
    	// Fix for 4515752: Forward the Enter pressed on the
    	// editable combo box to the default button 
     
    	// Note: This could depend on event ordering. The first ActionEvent
    	// from the editor may be handled by the JComboBox in which case, the
    	// enterPressed action will always be invoked.
    	public void actionPerformed(ActionEvent evt) {
    	    Object item = comboBox.getEditor().getItem();
    	    if (item != null) {
                 if(!comboBox.isPopupVisible() && !item.equals(comboBox.getSelectedItem())) { 
                  comboBox.setSelectedItem(comboBox.getEditor().getItem());
                 }
                 ActionMap am = comboBox.getActionMap();
                 if (am != null) {
                    Action action = am.get("enterPressed");
                    if (action != null) {
                        action.actionPerformed(new ActionEvent(comboBox, evt.getID(), 
                                               evt.getActionCommand(),
                                               evt.getModifiers()));
                    }        
                }
    ... donc, l'évènement provoque le comportement du bouton par défaut, dont le comportement habituel normal est de fermer la fenêtre, si c'est une fenêtre de dialogue modale ; or, en mettant ton composant dans un JOptionPane, tu es dans une fenêtre de dialogue modale.

    Si la fenêtre ne se ferme pas si on touche aux ToogleButtons, c'est parce que ce ne sont pas des boutons par défaut.

    À mon avis, tu devrais passer de l'évènement ACTION_PERFORMED à l'évènement ITEM_SELECTED ou assimilé pour qu'il soit interprété conformément à ce que tu attends ; du point de vue de l'éditeur, c'est un ACTION_PERFORMED, mais, lorsque la combo le reçoit, elle devrait diffuser un ITEM_SELECTED. Ou tu peux créer ton propre événement, par exemple NEW_ITEM, ou ITEM_USER_ENTERED, enfin comme tu veux.

  15. #15
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Merci de la suggestion, je teste ça dès lundi !

  16. #16
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Apres reflexion durant le w-e... mouais, non, bof... l'API de ComboBoxEditor nous propose les methodes addActionListener() et removeActionListener() et ce sans possibilite de manipuler d'autres evenements ou d'obtenir une reference sur la combo parente (mon but au final est quand meme d'essayer de faire un truc reutilisable*) ; normalement on devrait pouvoir esperer juste s'en sortir avec ca (... le lundi on est toujours plein d'espoir pour la semaine a venir ).

    J'ai donc poste chez Sun en attendant : http://forums.sun.com/thread.jspa?threadID=5327805

    *Vi vi, si jamais je ne trouve pas a regler le probleme, je me resignerai a prendre une reference de la combo parente en parametre du constructeur et je la modifierai manuellement au lieu de lancer un ActionEvent.

    PS : pour le probleme du menu deroulant, ca s'est regle avec un boolean indiquant si on etait en cours d'edition ou pas.

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 870
    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 870
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    53
    Par défaut
    Bon ben je me suis resolu a garder une reference sur la combo parente ce qui resoud effectivement le probleme :

    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
     
    /**
     * A combo box editor that only accepts integers.
     * @author  fabriceb
     */
    class SizeComboBoxEditor implements ComboBoxEditor, PropertyChangeListener {
     
      private JFormattedTextField delegated = new JFormattedTextField(new NumberFormatter(NumberFormat.getIntegerInstance()));
      private EventListenerList listenerList = new EventListenerList();
      private boolean isEditing;
      private WeakReference<JComboBox> parent;
     
      /**
       * Creates a new instance.
       */
      public SizeComboBoxEditor(JComboBox parent) {
        delegated.addPropertyChangeListener("value", this); // NOI18N
        //delegated.setBorder(UIManager.getBorder("ComboBox.border"));
        delegated.setBorder(new EmptyBorder(1, 2, 1, 0));
        this.parent = (parent == null) ? null : new WeakReference<JComboBox>(parent);
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public Component getEditorComponent() {
        return delegated;
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public void selectAll() {
        delegated.selectAll();
        delegated.requestFocus();
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public void setItem(Object anObject) {
        isEditing = true;
        if (delegated.getValue() == null || !delegated.getValue().equals(anObject)) {
          delegated.setValue(anObject);
        }
        isEditing = false;
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public Object getItem() {
        return delegated.getValue();
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public void addActionListener(ActionListener l) {
        listenerList.add(ActionListener.class, l);
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public void removeActionListener(ActionListener l) {
        listenerList.remove(ActionListener.class, l);
      }
     
      /**
       * {@inheritDoc}
       */
      @Override
      public void propertyChange(PropertyChangeEvent event) {
        if (!isEditing) {
          Object value = delegated.getValue();
          if (value == null) {
            return;
          }
          JComboBox parent = (this.parent == null) ? null : this.parent.get();
          if (parent != null) {
            isEditing = true;
            try {
              parent.setSelectedItem(value);
            }
            finally {
              isEditing = false;
            }
          }
        }
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Propagation d'un evenement personnalisé
    Par ryuhou dans le forum ActionScript 3
    Réponses: 7
    Dernier message: 23/01/2011, 20h15
  2. arreter la propagation d'evenement
    Par guy777 dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 27/06/2008, 16h29
  3. Propagation d'un evenement comme une fuite
    Par le merou dans le forum Delphi
    Réponses: 1
    Dernier message: 19/06/2007, 19h01
  4. Bloquer la propagation d'un evenement
    Par roudoudouduo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 03/04/2007, 19h52
  5. Stopper la propagation d'un evenement
    Par systemofaxav dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/06/2006, 15h41

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