【问题标题】:How to attach a window to another window如何将一个窗口附加到另一个窗口
【发布时间】:2012-08-06 18:11:59
【问题描述】:

请看下面的代码

Main.Java

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;


public class Main extends JFrame
{
    private JButton ok;

    public Main()
    {
        ok = new JButton("OK");
        ok.addActionListener(new ButtonAction());

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(ok);

        getContentPane().add(panel,"South");

        this.setVisible(true);
        this.setSize(new Dimension(200,200));
        this.validate();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main(String[]args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new Main();
        }
        catch(Exception e)
        {

        }
    }

    private class ButtonAction implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            Dialog d = new Dialog();
            d.setVisible(true);
        }
    }

}

Dialog.java

import java.awt.Event;
import java.awt.*;
import javax.swing.*;


public class Dialog extends JDialog
{
    private JButton done;

    public Dialog()
    {
        done = new JButton("Done");

        this.add(done);

        this.setSize(new Dimension(400,200));
    }

}

在这里,我想将 Dialog 表单“附加”到主表单。这意味着,当我单击 Main.Java 中的 OK 按钮时,对话框表单将附加到主表单的右侧。所以,当我移动主窗体时,对话框也会移动。但是,对话框窗体应该是独立的,也就是说,当我在对话框窗体中单击“x”按钮时,只有那个窗体存在,而不是主窗体。

当单击按钮时,如何将此对话框表单附加到主表单的右侧?请帮忙!

【问题讨论】:

  • 在 ButtonAction 的 actionPerformed 中,您应该将新创建的对话框的位置设置为您希望它连接到的主框架的一角。
  • 我认为这不是答案。这是最简单的事情。如果用户移动窗口,对话框不会移动
  • 这是一个开始。添加一个 WindowListener 来跟踪位置,并添加一个 ComponentListener 来跟踪大小。
  • 强烈建议在EDT上调用Swing相关代码。使用SwingUtilities.invokeLater(Runnable) 执行此操作。
  • 干得好。但是,如果您调整主框架的大小,它会起作用吗? ;)

标签: java swing user-interface jframe jdialog


【解决方案1】:

答案不是MouseListener,而是ComponentListener。我设法通过使用该侦听器的“componentMoved()”方法来做到这一点。

Main.java

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Main extends JFrame implements ComponentListener, ActionListener
{
    private JButton ok;
    private Dialog dialog;

    public Main()
    {
        ok = new JButton("OK");
        ok.addActionListener(this);

        dialog = new Dialog();

        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(ok);

        getContentPane().add(panel,"South");

        this.addComponentListener(this);

        this.setVisible(true);
        this.setSize(new Dimension(200,200));
        this.validate();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[]args)
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            new Main();
        }
        catch(Exception e){}
    }

    public void actionPerformed(ActionEvent ae)
    {   
        dialog.setVisible(true);
    }

    @Override
    public void componentHidden(ComponentEvent arg0) {}

    @Override
    public void componentMoved(ComponentEvent arg0) 
    {
        int x = this.getX() + this.getWidth();
        int y = this.getY();

        dialog.setDialogLocation(x, y);
    }

    @Override
    public void componentResized(ComponentEvent arg0) {}

    @Override
    public void componentShown(ComponentEvent arg0) {}
}

Dialog.java

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JDialog;


public class Dialog extends JDialog
{
    private JButton done;

    public Dialog()
    {
        done = new JButton("Done");

        this.add(done);

        this.setSize(new Dimension(400,200));
    }

    public void setDialogLocation(int x, int y)
    {
        this.setLocation(x, y);
    }

}

【讨论】:

    【解决方案2】:

    我不知道任何内置函数,你可以说“dialog.moveWithThisOtherWindow(otherWindow)”或类似的东西,它就发生了。您必须自己编写代码来执行此操作。

    在父窗体上创建鼠标侦听器或鼠标适配器。在鼠标侦听器中的“鼠标移动”事件中,移动子窗体。当然,父母必须对孩子有所了解。根据您创建窗口的方式,您可能需要某种“注册”函数,孩子可以调用它来向父母表明自己的身份。

    【讨论】:

    • "你可能需要某种“注册”函数,孩子可以调用它来向父母表明自己的身份。“这就是构造函数 JDialog (Window owner) 存在的原因。
    • 我在想这种“粘在一起”意义上的子窗口可能不是内置“模态和紧密在一起”意义上的子窗口。我想我应该更明确一点。
    • OK,但是如何获取右上角的位置呢? this.getX(), this.getY() 返回左侧位置对吗?因此,我必须将宽度添加到 getX() 以获取右侧 X。窗口的高度以获取右侧 y。不是吗?
    • @Yohan 是的,类似的。您必须获取窗口的位置并将其宽度/高度添加到相应的坐标中,具体取决于您想要的右角。之后,您必须编写一个MouseAdapter 并将其附加到主框架。当用户拖动框架时,重新计算窗口的位置(在 MouseAdapter 内)并重新定位对话框。试试看。如果您遇到困难,请回来,我们会尽力解决。
    • @SoboLAN:嗨,我找到了答案。看看:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多