0

JDialog移動してサイズを変更したい を作成しました。私のプログラムJDialogは画面に描画します。ユーザーがクリックすると、画面の幅まで伸びてから高さが増します。こんな感じでやってみました。

for(int i = 150; i <= width; i += 3) {
    dialog.setSize(i, 80);

    try {
        Thread.sleep(0, 1);
    } catch(Exception e2) {}
}

for(int i = 80; i <= 200; i++) {
    dialog.setSize(width, i);

    try {
        Thread.sleep(1);
    } catch(Exception e3) {}
}

コードが実行されると、しばらく時間がかかり、JDialog がすぐに引き伸ばされて表示されます。展開は表示されません。

ユーザーがダイアログをもう一度クリックすると、開くアニメーションが逆になり、閉じます。

for(int i = 200; i >= 80; i--) {
    newMsg.setSize(width, i);

    try {
        Thread.sleep(0, 1);
    } catch(Exception e4) {}
}   

for(int i = 0; i >= -width; i -= 3) {
    newMsg.setLocation(i, 100);

    try {
        Thread.sleep(0, 1);
    } catch(Exception e5) {}
}

これは正しく動作します。動きが見られます。私が理解している限り、これらのコードは逆になっていることを除けば同じです。オープニングは期待どおりに動作しないのに、クロージングは​​動作するのはなぜですか?

4

1 に答える 1

4

を呼び出さないThread.sleepでくださいEDT。これにより、UI が「フリーズ」します。代わりに、ここでSwing Timerを使用できます。最初の「拡張」がどのように処理されるかを次に示します。

Timer timer = new Timer(0, new ActionListener() {

   @Override
   public void actionPerformed(ActionEvent e) {
    updateDialogSize();
   }
});

timer.setDelay(5); // short delay
timer.start();

更新ダイアログ:

void updateDialogSize() {
   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   if (dialog.getWidth() < screenSize.getWidth()) { // 1st size width
      dialog.setSize(dialog.getWidth() + 5, dialog.getHeight());
   } else if (dialog.getHeight() < screenSize.getHeight()) { // then size height
     dialog.setSize(dialog.getWidth(), dialog.getHeight() + 5);
   } else {
      timer.stop(); // work done
   }

     dialog.setLocationRelativeTo(myFrame);
}

ダイアログ「収縮」は練習問題として残しておきます ;)

于 2012-12-30T17:50:37.260 に答える