Java 如何移动JPanel

Java 如何移动JPanel,java,swing,awt,Java,Swing,Awt,我有一个JDialog,其中包含JPanel和其他元素,如JTextField。在屏幕上加载后,我想将JDialog从一个位置移动到另一个位置。当我尝试使用jdialog.setLocation()时,我无法移动jdialog,并且添加到其中的所有其他组件也变得不可见 有人能告诉我我的方法可能有什么问题吗?如果你尝试制作动画,那么你必须初始化并启动一个新线程,然后在那里执行。线程的run()方法中的代码应检查对话框是否可见,并在每次迭代中使用修改的值调用dialog.setLocation()。

我有一个
JDialog
,其中包含
JPanel
和其他元素,如
JTextField
。在屏幕上加载后,我想将
JDialog
从一个位置移动到另一个位置。当我尝试使用
jdialog.setLocation()
时,我无法移动
jdialog
,并且添加到其中的所有其他组件也变得不可见


有人能告诉我我的方法可能有什么问题吗?

如果你尝试制作动画,那么你必须初始化并启动一个新线程,然后在那里执行。线程的
run()
方法中的代码应检查对话框是否可见,并在每次迭代中使用修改的值调用
dialog.setLocation()

关于Gilbert关于对话框设置为可见后无法移动的断言,请运行以下命令:

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);

   }
}
导入java.awt.Component;
导入java.awt.Dialog.ModalityType;
导入java.awt.Dimension;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类移动对话框{
私有静态void createAndShowGui(){
JPanel面板=新的JPanel();
添加(新的JButton(新的ShowMovingDialogAction());
JFrame=新JFrame(“移动对话框”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
类ShowMovingDialogAction扩展了AbstractAction{
private JPanel panel=new JPanel();
公共ShowMovingDialogAction(){
超级(“显示移动对话框”);
面板。添加(新的JLabel(“标签”);
添加(新JTextField(“TextField”,10));
面板添加(新的按钮);
}
@凌驾
已执行的公共无效操作(操作事件e){
JFrame所有者=(JFrame)SwingUtilities.GetWindowAn祖((组件)e
.getSource());
最终JDialog对话框=新JDialog(所有者,“对话框”,
ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(面板);
dialog.pack();
设置位置(0,0);
int延迟=20;
新计时器(延迟,新ActionListener(){
int x=0;
int y=0;
维度scrn=Toolkit.getDefaultToolkit().getScreenSize();
@凌驾
已执行的公共无效操作(操作事件e){
int maxX=scrn.width-dialog.getWidth();
int maxY=scrn.height-dialog.getHeight();
if(x

请注意,在调用setVisible(true)之前,必须先启动动画摆动计时器。也许这就是吉尔伯特所指的。

这是一个模态对话吗?我认为最好向我们展示一些代码以帮助您。您可能希望向我们展示一个小的可编译可运行程序,向我们展示您的问题,一个。听起来你好像在尝试制作某种动画。也许你需要一个摇摆计时器。@Hovercraft满是鳗鱼:是的,我正在尝试制作动画@Dan:是的,这是一个模式对话框。可以通过模拟鼠标选择并拖动到某个位置来完成吗?我不确定这是否是一个有效的问题这个问题是有效的,甚至可能是可能的。但是,我不建议你这样做,因为用户会完全害怕,而且你的代码和用户之间会有鼠标的竞争。丹:你应该使用Swing定时器,而不是后台线程。是的,它可以通过后台线程来完成,但是如果这样做,则需要注意调用Swing事件线程上的所有Swing方法。如果您使用Swing计时器(当然它在后台使用自己的工作线程),这个问题会由您来解决。@HovercraftFullOfEels:您能告诉我如何做到这一点吗?我看不到您的代码,那么OP为什么要问这个问题两次,尊敬的+1