5

JDialog含むJPanelと のような他の要素がありJTextFieldます。JDialog画面にロードされた後、ある場所から別の場所に移動したい。を使用しようとするjdialog.setLocation()と、移動できず、JDialog追加された他のすべてのコンポーネントも非表示になります。

私のアプローチの何が問題なのか誰か教えてもらえますか?

4

2 に答える 2

5

ダイアログを表示に設定した後は移動できないという 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);

   }
}

setVisible(true) を呼び出す前に、アニメーション Swing Timerを開始する必要があることに注意してください。ギルバートが言っていたのはおそらくそれだろう。

于 2012-08-24T19:19:52.690 に答える
3

アニメーションを実行しようとすると、新しいスレッドを初期化して開始し、そこで実行する必要があります。run()スレッドのメソッド内のコードは、ダイアログが表示されているかどうかを確認dialog.setLocation()し、反復ごとに変更された値で呼び出す必要があります。

于 2012-08-24T19:16:10.820 に答える