2012-11-20 33 views
0

我有一個GUI屏幕,它有一個標籤。我現在想用文本設置標籤,如下所示(Test)。但它沒有得到更新。我認爲在下面的代碼中有一個錯誤,我在try塊中重新創建了一個FrameTest的新對象;將文本顯示到另一個類的標籤 - JFrame

FrameTest frame = new FrameTest(); 
frame.setVisible(true); //(the full code given below) 

的完整代碼:注:下面的類是從的JFrame

import java.awt.BorderLayout; 

public class FrameTest extends JFrame { 

    private JPanel contentPane; 
    private JLabel lblLabel; 

    public void mainScreen() { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        FrameTest frame = new FrameTest(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 


    public void writeLabel(String k){ 
     this.lblLabel.setText(k); 

    } 


    public FrameTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     lblLabel = new JLabel("LABEL"); 
     contentPane.add(lblLabel, BorderLayout.CENTER); 
    } 

} 

測試類

public class Test { 

    public static void main(String[] args) { 

     FrameTest f = new FrameTest(); 
     f.mainScreen(); 
     f.writeLabel("FFFFF"); 
}} 

幫助延長,我怎樣才能得到文本"FFFFF"顯示的標籤?

+1

'的setBounds(100,100,450,300);'多少次,我們不得不說的呢?不要設置邊界 - 'pack()',然後'setLocationByPlatform(true)'。 –

回答

2

在你mainScreen()您創建一個新FrameTest這是您在日常main創建一個獨特的,所以它實際上改變了文本,無形的框架。試試這個:

private FrameTest frame = this; 

public void mainScreen() { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
       frame.setVisible(true); 
     } 
    }); 
} 

或者乾脆:

public void mainScreen() { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
       setVisible(true); 
     } 
    }); 
} 
+0

是的,這也適用。你能評論我的答案嗎?如果我稍後使用它,它是否正確或我會遇到其他問題? –

+0

@MouseEvent爲什麼有必要在函數中再次引用'this'對象。爲什麼他不只是說'this.setVisible(true)'或者簡單地說'setVisible(true)'? – sunil

+0

@sunil'this.setVisible(true)'不會工作',因爲它會引用'Runnable',而不是幀,但'setVisible(true)'應該工作。 – Mordechai

2

添加一個方法你FrameTest

public String readLabel(){ 
     return this.lblLabel.getText(); 
} 
+0

我想要的是編輯'Test'類的標籤文本。 –

0

你用你的代碼不會觸發你的框架或標籤的重繪的方式。 在Swing中,您可以更改許多Gui對象,但只有在請求時纔可以在一個批處理中重繪它們。 自動重新繪製時最常見的情況是從事件處理程序返回後。 (例如單擊按鈕或按鍵)

+3

不需要這樣做,'JLabel'會自動觸發它。 – Mordechai

+0

當你改變任何數量的屬性時,'JLabel'(就像許多組件)調用'revalidate'和'repaint'。我同意,有時需要微調,但更多的時候則不需要,Swing將自行更新 – MadProgrammer

0

替換try塊;

  try { 
       setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

一切正常!

+0

爲什麼............? – MadProgrammer

+0

你是什麼意思爲什麼?你有沒有看到任何錯誤? –

+0

'Runnable'沒有'setVisible()'方法,你現在正在繼承... – Mordechai

1

更改mainScreen()函數來

public void mainScreen() { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

剩下的代碼是相同

+0

這是因爲在'mainScreen'函數中,您正在創建另一個JFrame實例並向用戶顯示。在'Test'類中,您正在創建另一個'JFrame'實例'f'。這兩個對象完全不同,對一個對象所做的更改不能在另一個對象中顯示。 – sunil

相關問題