Java Swing - 如何使关闭对话框并不关闭整个程序?

时间:2017-04-10 18:44:06

标签: java swing

对于某些课程作业,我必须使用swing制作浏览器并实现多种功能,例如书签功能。我在这里要做的是有一个新窗口的类,它显示我存储的书签的下拉菜单。

我在这里使用了一个对话框,因为我不希望窗口有一个最小化按钮但是,当你关闭对话框时,现在整个程序关闭(实际的浏览器JFrame和程序中的其他所有内容)

我已将Dlg框的setDefaultCloseOperation设置为DISPOSE_ON_CLOSE,但它似乎不起作用,我也试图隐藏这个框。

这是我的代码,想知道我是做错了什么,或者只是对话框如何工作。干杯

import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public class SeeBookmarks extends JFrame {

    private JComboBox<String> seeBookmarks = new JComboBox<String>();       //Drop down box for the bookmarks

    public SeeBookmarks(BrowserPane screen, JButton seeBookmarksBtn) throws IOException {
        Dlg bookmarksFrame = new Dlg(new JFrame(), "Bookmarks");        //Dialog box (Replacement JFrame)

        try {
            Scanner bookmarks = new Scanner(new FileReader("bookmarks.txt"));       //Read the bookmarks file
            while (bookmarks.hasNextLine()) {                                       //While the file has another bookmark line
                seeBookmarks.addItem(bookmarks.nextLine());                         //    add it to the drop down box
            }
            bookmarks.close();          //Close file reader
        } catch (FileNotFoundException fnfe) {      //In case file does not exist
            FileWriter bookmarks = new FileWriter("bookmarks.txt");         //Create an empty bookmarks file
            bookmarks.close();          //Close file writer
        }

        seeBookmarks.addItemListener(new ItemListener() {           //Listener for the bookmarks drop down box
            public void itemStateChanged(ItemEvent item) {
                if (item.getStateChange() == ItemEvent.SELECTED) {                  //If an item is selected
                    screen.search(seeBookmarks.getSelectedItem().toString(), true); //    Search selected item, add to history
                    bookmarksFrame.dispose();                                       //    Close Dialog box
                    seeBookmarksBtn.setEnabled(true);                               //    Re-enable seeBookmarksBtn
                }
            }
        });

        bookmarksFrame.setLayout(new BorderLayout());               //Set Dialog box to Border layout
        bookmarksFrame.add(seeBookmarks, BorderLayout.CENTER);      //Display drop down box in center for dialog box

        bookmarksFrame.pack();          
        bookmarksFrame.setSize(300, 70);
        bookmarksFrame.setLocationRelativeTo(null);
        bookmarksFrame.setVisible(true);
        bookmarksFrame.setDefaultCloseOperation(Dlg.DISPOSE_ON_CLOSE);      //Meant to dispose the Dialog box
        bookmarksFrame.setResizable(false);
        bookmarksFrame.setAlwaysOnTop(true);
    }

}

1 个答案:

答案 0 :(得分:1)

  

我在这里使用了一个对话框

使用对话框是正确的。通常,应用程序应该只有一个JFrame来控制应用程序,然后使用子窗口的对话框。

关闭JDialog不会关闭应用程序,除非应用程序中没有其他活动框架。请注意,对话框甚至没有&#34; EXIT&#34;用于设置默认关闭操作的选项。所以问题出在你的代码执行的上下文中。

您发布的代码并没有真正帮助:

  1. 我们不知道Dlg课是什么。如果你想使用JDialog,那么只需创建一个JDialog。

  2. 您的课程不需要扩展JFrame。

  3. 我们不知道如何实际调用此对话框代码。也许你在其他类中有代码导致应用程序关闭?

  4. pack()和setVisible()应该是在将所有组件添加到对话框并且已设置所有对话框属性后要执行的最后两个语句。例如,将对话框设置为不可调整大小将改变边框的大小,从而改变对话框的大小。