Как работает JOptionPane - PullRequest
2 голосов
/ 29 мая 2010

Как я могу контролировать, что происходит с окном после нажатия кнопок JOPtionPane? Я пытаюсь реализовать простой файл выбора. В моем кадре 3 кнопки (ОК, Отмена, Обзор). Кнопка «Обзор» открывает окно поиска файлов, и после выбора файлов следует вернуться в основной фрейм. Нажатие ОК откроет фрейм с содержимым файла. Теперь Porblem выглядит так. С помощью приведенного ниже кода я могу выбрать файл, но сразу после этого создается новый кадр, и мой кадр с кнопками исчезает:
альтернативный текст http://img20.imageshack.us/img20/7614/windowh.png
альтернативный текст http://img267.imageshack.us/img267/1953/emptywindow.png

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);   
    }
}

Со вторым кодом я могу вернуться в свое меню, но никоим образом не могу открыть этот новый кадр, который появился с первым кодом. Как это контролировать? Чего мне не хватает?

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);
    }

}

Ответы [ 3 ]

2 голосов
/ 29 мая 2010

Используя ваш код. Пытался сделать это просто:

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 голосов
/ 29 мая 2010

С кодом ниже, я могу выбрать файл но сразу после этого новый кадр создал и мою рамку с кнопками исчезает:

Да, потому что, как только вы нажмете кнопку на панели JOptionPane, панель параметров закроется. Я не очень понимаю, что вы пытаетесь сделать, поэтому я не могу сделать предложение.

Однако в целом дизайн вашей программы неправильный. Вы не должны создавать и отображать панель параметров в методе, который создает графический интерфейс. Как только этот код будет выполнен, пользователь никогда не сможет выбрать другой файл, потому что нет способа повторно отобразить панель параметров.

Так что, возможно, вам нужно создать JFrame с помощью кнопки «Выбрать файл». Затем вы добавили бы простой ActionListener к этой кнопке, которая отображает текущую панель параметров. То есть вы должны начать отображение своего приложения с постоянного JFrame. Затем вы используете меню и пункты меню, чтобы выбрать файл. Так работает большинство приложений. В меню «Файл» у вас обычно есть пункт «Открыть». Нажатие на кнопку «Открыть» вызовет всплывающее диалоговое окно со всеми открытыми параметрами. Затем, когда файл выбран, вы отображаете содержимое файла в основном JFrame.

0 голосов
/ 29 мая 2010

У вас могла бы быть кнопка просмотра FileDialog, как показано в этом примере .

...