2013-08-12 3 views
0

un autre problème. Je voulais faire doubleclick sur JTable qui ouvre une nouvelle fenêtre avec forme. Donc, finalement, je l'ai fait de cette façon:La multiplication des fenêtres dans Java App

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 

    table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){ 
     public void valueChanged(ListSelectionEvent event){ 
      int viewRow = table.getSelectedRow(); 
      if(viewRow < 0) 
       System.out.println("LOL"); 
      else{ 
       final int modelRow = table.convertRowIndexToModel(viewRow); 
       table.addMouseListener(new MouseAdapter(){ 
        public void mouseClicked(MouseEvent e){ 
         if(e.getClickCount() == 2) 
          try { 
           new BookForm(); 
          } catch (IOException e1) { 
           e1.printStackTrace(); 
          } 

        } 
       }); 
      } 

     } 
    }); 

Cela fonctionne, mais pas parfait. La première fois que je clique deux fois sur JTable ça ouvre 2 fenêtres (pourquoi pas une?), La prochaine fois ça ouvre 4 fenêtres, ensuite 6 autres fenêtres, etc. Des idées? Peut-être que je devrais avoir à utiliser une méthode différente? Merci pour l'aide!

Répondre

2

Prenez une seconde pour regarder par-dessus votre code ...

Chaque fois que les changements de sélection, vous ajoutez une nouvelle MouseListener

table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){ 
    public void valueChanged(ListSelectionEvent event){ 
     int viewRow = table.getSelectedRow(); 
     if(viewRow < 0) 
      System.out.println("LOL"); 
     else{ 
      // You add a new mouse listener... 
      final int modelRow = table.convertRowIndexToModel(viewRow); 
      table.addMouseListener(new MouseAdapter(){ 
       public void mouseClicked(MouseEvent e){ 
        if(e.getClickCount() == 2) 
         try { 
          new BookForm(); 
         } catch (IOException e1) { 
          e1.printStackTrace(); 
         } 

       } 
      }); 
     } 

    } 
}); 

Donc, quand vous « enfin » double-cliquez sur une ligne, vous aura 1-n MouseListener s inscrits sur la table ...

Vous pouvez tout simplement se débarrasser de l'auditeur de sélection et simple ajouter le MouseListener directement à la table ...

table.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent e){ 
     if(e.getClickCount() == 2) 
      int selectedRow = table.getSelectedRow(); 
      if (selectedRow > -1) { 
       int modelRow = table.convertRowIndexToModel(selectedRow); 
       try { 
        new BookForm(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
    } 
}); 

Jetez aussi un coup d'œil à The Use of Multiple JFrames: Good or Bad Practice? avant de bombarder votre barde utilisateur avec beaucoup de nouvelles fenêtres ...

+0

Mon dieu, si stupide erreur. Je ne regarde même pas dans cette direction. Et je n'utilise pas beaucoup de cadres, en fait c'est le seul. Cependant, ça va être pour mon usage personnel dans ma petite bibliothèque à la maison. Merci beaucoup pour votre aide, je l'ai fait fonctionner. – Zano

+0

Parfois, nous ne pouvons pas voir la forêt pour les arbres - bienvenue dans mon monde;) – MadProgrammer