2016-12-17 5 views
0

最近私はGUIプログラミングに触れてみました。しかし、私は小さなエラーが発生しました。私のJPanelに追加されたJLabelは表示されません。私はValidateとRepaintを呼び出しましたが、どちらも表示されていません。ラベルがパネルに表示されない(再ペイントして検証しようとした)

このコードでは、イベント処理にSWINGとawtを使用しています。ここで

は、私は、問題を再現するために一緒に入れている非常に速いコードです:

package com.first; 

    import java.awt.Color; 
    import java.awt.EventQueue; 
    import java.awt.Font; 
    import java.awt.Graphics; 

    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 

    public class wraith 
    { 
      public static void main(String[] arg) 
      { 
        EventQueue.invokeLater(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          JFrame frame = new JFrame("Wraith, the game"); 
          JPanel panel = new JPanel() 
          { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 1L; 

           @Override 
           public void paint(Graphics g) { 
            super.paint(g); 
            this.setBackground(new Color(0f,0f,0f,1.0f)); 
           } 

          }; 
          JLabel label = new JLabel() 
          { 

           /** 
           * 
           */ 
           private static final long serialVersionUID = 1L; 

           @Override 
           public void paint(Graphics arg0) 
           { 
            super.paint(arg0); 
            this.setForeground(Color.WHITE); 
            this.setText("Width: " + frame.getWidth() + " Height: " + frame.getHeight()); 
            this.setHorizontalAlignment(LEFT); 
            this.setVerticalAlignment(TOP); 
           } 

          }; 
          frame.setSize(500, 500); 
          frame.add(panel); 
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
          panel.add(label); 
          panel.validate(); 
          frame.setVisible(true); 
         } 

        }); 
      } 
    } 

答えて

2

ペイントメソッドをオーバーライドして、コンポーネントのプロパティを設定しないでください。

あなたはコンポーネントを作成し、あなたがそのプロパティを設定:

JLabel label = new JLabel("..."); 
label.setForeground(Color.WHITE); 
label.setHorizontalAlignment(JLabel.LEFT); 
label.setVerticalAlignment(JLabel.TOP); 

は、どのように私は/あなたが動的に幅を表示したい場合は、私のラベル

this.setText("Width: " + frame.getWidth() + " Height: " + frame.getHeight()); 

を更新することになっていますフレームの高さを変更する場合は、リスナーを使用して変更のラベルを通知する必要があります。この場合、ComponentListenerを使用し、componentResized(...)メソッドを処理します。したがって、基本的にcomponentResized(...)メソッドでは、label.setText(...)を使用します。つまり、ラベルをクラスのインスタンス変数として定義する必要があります。

開始コードはHow to Write a ComponentListenerのSwingチュートリアルのセクションを読んでください。

JPanelと同じアドバイスです。パネルの背景を設定するためだけにpaint()をオーバーライドしないでください。パネルを作成したら、setBackground()メソッドを呼び出してください。

+0

右:これは実際に助けてくれました。 – Delupara

+0

@Delupara:Rob Camickは、賢いSwingプログラマーの一人です。 1 + –

+0

私は実際に補聴器を知らなかった。私はアクションとウィンドウリスナーを知っていましたが、感謝しました。 – Delupara

2

あなたがそのテキストを作成するために、JLabelののpaintメソッドを使用している場合、それはサイズ自体にそのテキストを使用することはありませんし、ラベルのサイズは0 x 0のままです。このため、JLabelのsetText(...)メソッドを使用してテキストを設定します。 Swingコンポーネントのpaintメソッドを無関係にオーバーライドすることは決してほとんどありません。たいていpaintComponentメソッドをオーバーライドするだけです。

+0

ラベルの塗り方を指定できない場合、ラベルを更新するにはどうすればよいですか? – Delupara

+0

@Delupara:あなたがそれを変更する必要があるときにテキストを設定して更新します。 JLabelに直接ペイントすることはめったにありません。 –

関連する問題