2016-12-17 65 views
0

我最近嘗試過觸摸GUI編程,實際上這個概念非常簡單。不過,我遇到了一個小錯誤。我的JPanel上添加的JLabel沒有顯示。我稱之爲驗證和重繪,但都沒有顯示。標籤不會顯示在面板上(重新繪製並驗證嘗試過)

代碼使用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(...),這意味着標籤需要被定義爲類中的一個實例變量。

請閱讀Swing教程How to Write a ComponentListener中的部分,以獲取開始的示例代碼。

請注意,對於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上繪畫,當然不是你如何做。 –

相關問題