Java 如何将一个窗口附加到另一个窗口
请看一下下面的代码 Main.JavaJava 如何将一个窗口附加到另一个窗口,java,swing,user-interface,jframe,jdialog,Java,Swing,User Interface,Jframe,Jdialog,请看一下下面的代码 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(
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);
}
}
}
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.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);
}
}
}
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));
}
}
在这里,我想将对话框窗体“附加”到主窗体。这意味着,当我单击Main.Java中的OK按钮时,对话框窗体将附加到主窗体的右侧。因此,当我移动主窗体时,对话框也会被移动。但是,对话框窗体应该是独立的,这意味着,当我在对话框窗体中单击“x”按钮时,只有该窗体存在,而不是主窗体
单击按钮时,如何将此对话框窗体附加到主窗体的右侧?请帮忙 我不知道有什么内置函数,你可以直接说“dialog.moveWithThisOtherWindow(otherWindow)”或类似的话,但它确实发生了。您必须自己编写代码来完成这项工作
在父窗体上创建鼠标侦听器或鼠标适配器。在鼠标侦听器中的“鼠标移动”事件中,移动子窗体。当然,父母必须对孩子有控制权。根据您创建窗口的方式,您可能需要某种类型的“注册”函数,孩子可以调用该函数向家长标识自己。答案不是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);
}
}
在ButtonAction的actionPerformed中,您应该将新创建的对话框的位置设置为您希望连接到的主框架的一角。我认为这不是答案。这是最简单的事情。如果用户移动窗口,对话框将不会移动。这是一个开始。将WindowListener添加到曲目位置,将ComponentListener添加到曲目大小。强烈建议在EDT上调用与Swing相关的代码。使用
SwingUtilities.invokeLater(Runnable)
完成此操作。做得好。但是,如果调整主框架的大小,它会起作用吗?;)“您可能需要某种类型的“注册”函数,孩子可以调用它来向家长标识自己。”这就是为什么构造函数JDialog(窗口所有者)
存在的原因。我认为这种“粘在一起”意义上的子窗口可能不也是内置的“模态和紧密连接”意义上的孩子。我想我应该说得更清楚一些。好吧,但是如何确定右拐角的位置呢?this.getX(),this.getY()返回左侧位置,对吗?因此,我必须将宽度添加到getX()以获得窗口的右侧X.hight以获得右侧y。是吗?@Yohan是的,差不多。您必须获得窗口的位置,并将其宽度/高度添加到相应的坐标中,具体取决于所需的右角。之后,您必须编写一个MouseAdapter
,并将其连接到主框架。当用户拖动帧时,重新计算窗口的位置(在MouseAdapter
内)并重新定位对话框。试试看。如果你被卡住了,回来,我们会设法解决。@SoboLAN:嗨,我找到答案了。看一看:)