我有一个 JDialog 其中包含 JPanel 以及其他元素,比如 JTextField . 我想搬家 JDialog 在屏幕上加载后从一个位置到另一个位置。当我尝试使用 jdialog.setLocation() ,我不能动了 JDialog 而且所有其他添加到它的组件也变得不可见。有人能告诉我我的方法有什么问题吗?
JDialog
JPanel
JTextField
jdialog.setLocation()
vom3gejh1#
如果你尝试做动画,那么你将不得不初始化并启动一个新的线程,并在那里做它。里面的代码 run() 线程的方法应该检查对话框是否可见并调用 dialog.setLocation() 在每次迭代中使用修改的值。
run()
dialog.setLocation()
bpsygsoo2#
关于gilbert关于对话框设置为可见后不能移动的Assert,请运行以下命令:
import java.awt.Component; import java.awt.Dialog.ModalityType; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class MovingDialog { private static void createAndShowGui() { JPanel panel = new JPanel(); panel.add(new JButton(new ShowMovingDialogAction())); JFrame frame = new JFrame("MovingDialog"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(panel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGui(); } }); } } class ShowMovingDialogAction extends AbstractAction { private JPanel panel = new JPanel(); public ShowMovingDialogAction() { super("Show Moving Dialog"); panel.add(new JLabel("label")); panel.add(new JTextField("TextField", 10)); panel.add(new JButton("Button")); } @Override public void actionPerformed(ActionEvent e) { JFrame owner = (JFrame) SwingUtilities.getWindowAncestor((Component) e .getSource()); final JDialog dialog = new JDialog(owner, "Dialog", ModalityType.APPLICATION_MODAL); dialog.getContentPane().add(panel); dialog.pack(); dialog.setLocation(0, 0); int delay = 20; new Timer(delay , new ActionListener() { int x = 0; int y = 0; Dimension scrn = Toolkit.getDefaultToolkit().getScreenSize(); @Override public void actionPerformed(ActionEvent e) { int maxX = scrn.width - dialog.getWidth(); int maxY = scrn.height - dialog.getHeight(); if (x < maxX && y < maxY) { x++; y++; dialog.setLocation(x, y); } else { ((Timer)e.getSource()).stop(); } } }).start(); dialog.setVisible(true); } }
请注意,在调用setvisible(true)之前,必须启动动画摆动计时器。也许这就是吉尔伯特所指的。
2条答案
按热度按时间vom3gejh1#
如果你尝试做动画,那么你将不得不初始化并启动一个新的线程,并在那里做它。里面的代码
run()
线程的方法应该检查对话框是否可见并调用dialog.setLocation()
在每次迭代中使用修改的值。bpsygsoo2#
关于gilbert关于对话框设置为可见后不能移动的Assert,请运行以下命令:
请注意,在调用setvisible(true)之前,必须启动动画摆动计时器。也许这就是吉尔伯特所指的。