1

ボタンが押されたときに動的に変更する必要があるJLabelがあります。JLabel.setText(s)を使用しています

ただし、動作していません。私はもう試した:

JLabel.repaint()
JLabel.validate()
JLabel.revalidate()

私が奇妙だと思うのは、次のいずれかを使用してJLabelのサイズを設定しない場合に正常に機能することです。

JLabel.setPrefferedSize()
JLabel.setMinimumSize()
JLabel.setSize()

サイズプロパティの1つを設定した後、なぜ機能しないのか、誰か助けてもらえますか?

4

4 に答える 4

2

ボタンが行っていることは、おそらく非常に長い作業であり、プロセスについてユーザーに知らせておきたいと考えています。

これを行うには、長いタスクを実行する新しいスレッドを作成する必要があり、ラベルに新しいテキストを設定するときに、label.setText()ステートメントを次のようにラップしinvokeLater()ます。

public void buttonAction()
{
   new Thread(new Runnable()
   {
       public void run()
       {
           // Here your long task

           // When you want to call Label.setText(), do it like this:
           SwingUtilities.invokeLater(new Runnable()
           {
               public void run()
               {
                   label.setText("Loading 1/13...");
               }
           });

           // Here another part of your task....

           SwingUtilities.invokeLater(new Runnable()
           {
               public void run()
               {
                   label.setText("Done!");
               }
           });
       }
   }).start();
}
于 2011-10-04T16:02:06.653 に答える
1

Swing でコンポーネントのサイズを変更する場合、最終的には親コンテナーのレイアウトがコンポーネントのサイズを決定します。

たとえば、コンポーネントで 、 、、またはをFlowLayout呼び出すと、ラベルにそのサイズが与えられ、それ以上のサイズにはなりません。ただし、そのサイズから始まり、それより上のサイズになります。setPreferredSize()setSize()setMaximumSize()setMinimumSize()

の場合BorderLayout、コンポーネントが中央に追加された場合、どのサイジング方法もコンポーネントに影響を与えません。利用可能なスペースの最大量を使用するだけです。

親コンテナのレイアウトを に設定すると、nullコンポーネントのサイズを明示的に変更できますが、他のレイアウトでの自動サイズ変更は失われます。

于 2011-10-04T16:04:41.947 に答える
0

私の問題を理解し、

私が使用していたもの:

JLabel.setPreferredSize(100, JLabel.getheight());

私はに変更しました:

JLabel.setPreferredSize(100, 22);
于 2011-10-05T09:32:59.300 に答える