2010-05-29 16 views
2

Comment puis-je contrôler ce qui se passe avec la fenêtre après avoir cliqué sur les boutons JOPtionPane? J'essaye d'implémenter le sélecteur simple de dossier. Dans mon cadre j'ai 3 boutons (OK, Annuler, Parcourir). Le bouton Parcourir ouvre la fenêtre de recherche de fichiers et, après avoir sélectionné les fichiers, doit revenir au cadre principal. Cliquer sur OK ouvrira un cadre avec le contenu du fichier. Maintenant, le porblem a l'air de cette façon. Avec le code ci-dessous, je peux choisir le fichier, mais directement après qu'un nouveau cadre est créé, et mon cadre avec boutons dissapears:
alt text http://img20.imageshack.us/img20/7614/windowh.png
alt text http://img267.imageshack.us/img267/1953/emptywindow.pngComment fonctionne JOptionPane

import java.io.File; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.awt.*; 
import javax.swing.*; 
import java.io.*; 

public class Main { 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       show("Window"); 
      } 
     }); 
    } 

    public static void show(String frame_name){ 
     JFrame frame = new JFrame(frame_name); 
     frame.setPreferredSize(new Dimension(450, 300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel top = new JPanel(); 
     top.setLayout(new BoxLayout(top, BoxLayout.Y_AXIS)); 

     JFileChooser fc = new JFileChooser(new File(".")); 

     JPanel creator = new JPanel(); 
     creator.setLayout(new BoxLayout(creator, BoxLayout.Y_AXIS)); 
     creator.add(top); 

     String[] buttons = {"OK", "Cancel", "Browse"}; 

     int rc = JOptionPane.showOptionDialog(
        null, 
        creator, 
        frame_name, 
        JOptionPane.DEFAULT_OPTION, 
        JOptionPane.PLAIN_MESSAGE, 
        null, 
        buttons, 
        buttons[0] 
       ); 

     String approveButt = ""; 

     switch(rc){ 
      case 0: 
       break; 
      case 1: 
       break; 
      case 2: 
     approveButt = buttons[rc]; 
     int retVal = fc.showDialog(null, approveButt); 
     if (retVal == JFileChooser.APPROVE_OPTION) 
      System.out.println(approveButt + " " + fc.getSelectedFile()); 
       break; 
     } 
     frame.pack(); 
    frame.setVisible(true); 
    } 
} 

Avec le second code je peux revenir à mon menu, mais en aucun cas je suis capable de faire apparaître ce nouveau cadre, qui est apparu avec le premier code. Comment contrôler cela? Qu'est-ce que je rate ?

public class Main { 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       show("Window"); 
      } 
     }); 
    } 

    public static void show(String frame_name){ 
     JFrame frame = new JFrame(frame_name); 
     frame.setPreferredSize(new Dimension(450, 300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel top = new JPanel(); 
     top.setLayout(new BoxLayout(top, BoxLayout.Y_AXIS)); 
     JFileChooser fc = new JFileChooser(new File(".")); 
     JPanel creator = new JPanel(); 
     creator.setLayout(new BoxLayout(creator, BoxLayout.Y_AXIS)); 
     creator.add(top); 

     String[] buttons = {"OK", "Cancel", "Browse"}; 
     String approveButt = ""; 

     Plane m = null; 

     int rc = -1; 
     while (rc != 0) { 
      rc = JOptionPane.showOptionDialog(
         null, 
         creator, 
         frame_name, 
         JOptionPane.DEFAULT_OPTION, 
         JOptionPane.PLAIN_MESSAGE, 
         null, 
         buttons, 
         buttons[0] 
        ); 

     switch (rc) { 
     case 0: 
      m = new Plane(); 
     case 1: 
      System.exit(0); 
     case 2: 
      approveButt = buttons[rc]; 
      int retVal = fc.showDialog(null, approveButt); 
      if (retVal == JFileChooser.APPROVE_OPTION) 
       System.out.println(approveButt + " " + fc.getSelectedFile()); 
      break; 
     default: 
      break; 
     } 
     }  
       addComponents(frame.getContentPane(), m); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static void addComponents(Container c, Plane e) { 
     c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS)); 
     c.add(e); 
    } 
} 

class Plane extends JPanel { 

    public Plane(){ 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.setColor(Color.BLUE); 
     g.fillRect(0, 0, 400, 250); 
    } 

} 

Répondre

2

En utilisant votre code. Je ai essayé de le rendre simple:

import java.awt.*; 
import javax.swing.*; 
import java.io.*; 


public class Main { 

    public static void main(String args[]) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       show("Window"); 
      } 
     }); 
    } 

    public static void show(String frame_name){ 
     JFrame frame = new JFrame(frame_name); 
     frame.setPreferredSize(new Dimension(450, 300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel top = new JPanel(); 
     top.setLayout(new BoxLayout(top, BoxLayout.Y_AXIS)); 

     JPanel creator = new JPanel(); 
     creator.setLayout(new BoxLayout(creator, BoxLayout.Y_AXIS)); 
     creator.add(top); 

     JFileChooser fc = new JFileChooser(new File(".")); 

     String[] buttons = {"OK", "Cancel", "Browse"}; 

     int rc=-1; 

     do { 
      rc = JOptionPane.showOptionDialog(
         null, 
         creator, 
         frame_name, 
         JOptionPane.DEFAULT_OPTION, 
         JOptionPane.PLAIN_MESSAGE, 
         null, 
         buttons, 
         buttons[0] 
        ); 

      if(rc == 1){ 
       System.exit(0); 
       break; 
      } 
      else if(rc == 2){ 
       int retVal = fc.showDialog(null, "Test"); 
       if (retVal == JFileChooser.APPROVE_OPTION) 
        System.out.println("File choose" + fc.getSelectedFile()); 
      } 
     } while (rc != 0); 

     if(rc == 0){ 
       frame.setVisible(true); 
       frame.pack(); 
     } 
    } 
} 
0

Avec le code ci-dessous, je peux choisir le fichier mais directement après qu'un nouveau cadre est créé, et mon cadre avec des boutons dissapears:

Oui parce que dès que vous cliquez sur un bouton Sur le JOptionPane, le volet des options est fermé. Je ne comprends pas vraiment ce que vous essayez de faire, donc je ne peux pas faire de suggestion.

Cependant, en général, la conception de votre programme est erronée. Vous ne devez pas créer et afficher le volet d'options dans la méthode qui crée l'interface graphique. Une fois ce code exécuté, l'utilisateur ne pourra jamais sélectionner un autre fichier car il est impossible de réafficher le volet d'options.

Alors peut-être vous avez besoin de créer votre JFrame avec un bouton comme "Sélectionner un fichier". Vous ajouteriez alors un simple ActionListener à ce bouton qui affiche le volet d'options en cours. C'est vous devriez commencer l'affichage de votre application avec un JFrame permanent. Ensuite, vous utilisez les menus et les éléments de menu pour sélectionner un fichier. C'est ainsi que la plupart des applications fonctionnent. Dans le menu "Fichier", vous avez généralement un élément de menu "Ouvrir". Cliquer sur Ouvrir ouvrirait une boîte de dialogue avec toutes les options ouvertes. Ensuite, lorsqu'un fichier est sélectionné, vous affichez le contenu du fichier dans le JFrame principal.