【问题标题】:Java Swing - How do I make it so that closing a Dialog box doesn't close the entire program?Java Swing - 如何使关闭对话框不会关闭整个程序?
【发布时间】:2017-04-10 18:44:05
【问题描述】:

对于某些课程作业,我必须使用 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);
    }

}

【问题讨论】:

标签: java swing


【解决方案1】:

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

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

除非应用程序中没有其他活动框架,否则关闭 JDialog 不会关闭应用程序。请注意,该对话框甚至没有用于设置默认关闭操作的“退出”选项。所以问题在于你的代码是如何执行的。

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

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

  2. 您的类不需要扩展 JFrame。

  3. 我们不知道这个对话代码是如何被实际调用的。也许您在其他类中有导致应用程序关闭的代码?

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

【讨论】:

  • 将它从 Dlg 更改为 JDialog 修复了它,谢谢,我使用 Dlg 是因为我在另一篇关于删除可调整大小的帖子中看到了它。也感谢您的其他建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2022-11-03
  • 2013-11-11
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多