Как работает JOptionPane
-
05-10-2019 - |
Вопрос
Как я могу контролировать, что происходит с окном после нажатия кнопок JOPtionPane?Я пытаюсь реализовать простой выбор файлов.В моем фрейме есть 3 кнопки (ОК, Отмена, Обзор).Кнопка «Обзор» открывает окно поиска файлов, и после выбора файлов следует вернуться в основной фрейм.Нажатие кнопки «ОК» откроет фрейм с содержимым файла.Сейчас порблема выглядит вот так.С помощью приведенного ниже кода я могу выбрать файл, но сразу после этого создается новый кадр, и мой кадр с кнопками исчезает:
альтернативный текст 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);
}
}
Решение
Используя ваш код. Пытался сделать это прямолировным:
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();
}
}
}
Другие советы
Вы можете иметь свой дисплей кнопки просмотра FileDialog
, Как видно в этом пример.
С приведенным ниже кодом я могу выбрать файл, но сразу же после этого создается новый кадр, и мой кадр с кнопками исчезает:
Да, потому что как только вы нажмете кнопку на JOptionPane, панель параметров закроется.Я не совсем понимаю, что вы пытаетесь сделать, поэтому не могу предложить.
Однако в целом конструкция вашей программы неправильная.Вам не следует создавать и отображать панель параметров в методе, создающем графический интерфейс.После выполнения этого кода пользователь никогда не сможет выбрать другой файл, поскольку повторно отобразить панель параметров невозможно.
Так что, возможно, вам нужно создать свой JFrame с помощью кнопки типа «Выбрать файл».Затем вы добавите к этой кнопке простой ActionListener, который отображает текущую панель параметров.То есть вам следует начать отображение вашего приложения с постоянным JFrame.Затем вы используете меню и пункты меню для выбора файла.Именно так работает большинство приложений.В меню «Файл» обычно есть пункт «Открыть».Нажатие кнопки «Открыть» приведет к появлению диалогового окна со всеми вариантами открытия.Затем, когда файл выбран, вы отображаете содержимое файла в основном JFrame.