【问题标题】:JFrame, toFront(), ActionListenerJFrame, toFront(), ActionListener
【发布时间】:2015-01-13 23:17:03
【问题描述】:

我的问题是这个。我得到了这两个可以一起工作并一起移动的窗口。

但是,如果我随后打开浏览器或将出现在屏幕前面的东西,然后我尝试通过在任务栏上单击它来将我的程序显示在前面,那么只有一个窗口会出现在前面。对话框在后面,我不知道如何修复它。

我知道有 ToFront() 函数,但我仍然不知道如何在这种情况下使用它。

【问题讨论】:

  • 为主窗口中的第二个窗口创建一个 MenuItem,它将在基本计算器和高级计算器之间切换。 (例如 Windows 计算器 -> 科学等)
  • 它会解决问题还是只是审美的建议?
  • 我自己现在是一名大学生,过去两年我做了很多计算器,最简单的是实现一个MenuItem。

标签: java user-interface jframe jdialog


【解决方案1】:

不要创建两个 JFrame,而是为您的主窗口创建一个 JFrame,并将所有其他窗口创建为非模态 JDialog,并以 JFrame 作为它们的所有者。这将导致它们被堆叠为一个组;每当用户把一个放在前面,所有的都放在前面。

【讨论】:

  • 小窗口是JDialog。
【解决方案2】:

这应该可以解决您的问题,正如 VGR 已经说过的那样...非模态对话框将跟随它的父级:

public class FocusMain extends JFrame {

    private static FocusMain frame;
    private static JDialog dialog;
    private JCheckBox checkBox;

    private JPanel contentPane;

    public static void main(String[] args) {
        frame = new FocusMain();
        frame.setVisible(true);
        dialog = new JDialog(frame);
        dialog.setSize(100, 100);
    }

    public FocusMain() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);

        checkBox = new JCheckBox("show dialog");
        checkBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (checkBox.isSelected()) {
                    dialog.setVisible(true);
                } else {
                    dialog.setVisible(false);
                }
            }
        });
        contentPane.add(checkBox);
    }
 }

使用扩展的 JDialog,您将需要通过构造函数传递父框架,如果您的构造函数如下所示:public ExtendedJDialog(JFrame parentFrame),那么您可以将其与父框架连接起来,super(parentFrame); 作为构造函数中的第一行。 .

 public class FocusMain extends JFrame {

    private static FocusMain frame;
    private static FocusDialog dialog;
    private JCheckBox checkBox;

    private JPanel contentPane;

    public static void main(String[] args) {
        frame = new FocusMain();
        frame.setVisible(true);
        dialog = new FocusDialog(frame);
    }

    public FocusMain() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        setContentPane(contentPane);

        checkBox = new JCheckBox("show dialog");
        checkBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (checkBox.isSelected()) {
                    dialog.setVisible(true);
                } else {
                    dialog.setVisible(false);
                }
            }
        });
        contentPane.add(checkBox);
    }
 }

和扩展的 JDialog

 public class FocusDialog extends JDialog {

    public FocusDialog(JFrame parentFrame) {
        super(parentFrame);
        setSize(100, 100);
    }
 }

如果您需要对话框来阻止父级,请使用super(parentFrame, true);

【讨论】:

  • 我想我知道问题出在哪里。这个较小的窗口是一个 Jpanel,但是我在另一个类和它的 JDialog 扩展中制作了它。 public class FunkcjeMatematyczne extends javax.swing.JDialog 我没有做什么,我不知道该怎么做:dialog = new JDialog(frame_owner); 设置对话框所有者。甚至有可能在扩展课程中......?
  • 您可以在扩展课程中使用super(parentFrame); 进行此操作,我将编辑我的答案以包含此...
  • 当我把这个super(Okno_Glowne); 放在我扩展的 JDialog 类的构造函数中时,我收到消息“在调用超类型构造函数之前无法引用 Okno_Glowne”。附言。 Okno_Glowne 是 JFrame 的扩展...
  • 那么你必须将okno 传递给super() 而不是Okno_Glowne,因为这是传递给构造函数后的变量名。试试super(okno);
  • 懒得查了。它有帮助!
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多