2015-06-21 207 views
-1

此代碼也正在編譯和執行,但方法actionPerformed()未正確執行。我的意思是在點擊確定按鈕後,JTextField中沒有寫入任何內容。即使在使用e.getSource()後也不執行任何操作。 System.out.println("I am done ")工作正常,但t.setText("Hey there")不起作用。?代碼有什麼問題?如果有人願意,請幫助我。
而且你能否詳細說明爲什麼如果不在Panel上添加JButtonJTextField這是不可見的?爲了使按鈕和文本字段可見,爲什麼添加面板很重要。沒有它是不可見的原因?我的代碼有什麼問題?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

class A implements ActionListener { 

    JFrame f; 
    JButton b; 
    JPanel p; 
    JLabel l; 
    JTextField t; 

    A(String s) { 
     JFrame f=new JFrame(s); 
     f.setVisible(true); 
     f.setSize(400,400); 
     JButton b= new JButton("OK"); 
     JTextField t=new JTextField(); 
     JPanel p=new JPanel(); 
     f.add(p); 
     p.setBounds(0,0,300,300); 
     p.add(b); 
     b.setBounds(30,40,80,80); 
     p.add(t); 
     t.setBounds(100,200,80,80); 
     b.addActionListener(this); 
     t.addActionListener(this); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == b) {  
      t.setText("Hey There"); 
     } 
     System.out.println("I m done!!"); 
    } 

    public static void main(String[] args) { 
     System.out.println("Hey there"); 
     new A("First App"); 
    } 
} 
+0

* 「也可以你..」 * SO上應該是一個單一的,具體的問題一個問題。其他問題最好從不同的線索開始。另外:使用縮進代碼行和塊的邏輯和一致的形式。縮進旨在使代碼的流程更易於遵循! –

+0

還請注意,您的問題標題對我們沒有幫助,因爲它是單獨的非信息性的。 「我的代碼有什麼問題」告訴我們關於你的問題沒有任何**,除了你有問題 - 但我們已經知道了,否則你不會在這裏。今後,請努力以更好的標題提出更好的問題。這將有助於你和我們。 –

+2

'f.setVisible(true);'應該是'pack()'後的最後一個。和'p.setBounds(0,0,300,300);'Java GUI必須在不同的操作系統上工作',屏幕大小,屏幕分辨率等等,在不同的語言環境中使用不同的PLAF。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 –

回答

3

你被重新宣佈它在你的構造這意味着在類的b字段不顯示在你的GUI相同的陰影中b變量。不要這樣做,你的問題就解決了。

即,你這樣做是:

class A { 
    JButton b; // this guy stays null! 

    public A() { 
     JButton b = new JButton(...); 
    } 

解決的辦法是要做到這一點:

class A { 
    JButton b; 

    public A() { 
     b = new JButton(...); //note the difference? 
    } 

你問:

爲什麼重要的是要增加面板爲了使按鈕和文本字段在擺動中可見?

這是一個佈局管理器的問題。默認情況下,JPanel使用FlowLayout,這將允許您添加組件,例如從左上角的書架中填寫書籍。另一方面,JFrame的contentPane使用BorderLayout,如果你默認添加了這個東西,只有最後添加的東西纔會顯示並填充GUI。請注意,您正在嘗試setBounds(...),您不應該這樣做。讓佈局經理做那件事。

+0

謝謝你:)所有人..(Y) – RedEyes

+0

爲什麼爲了使按鈕和文本字段在擺動中可見而添加面板很重要? – RedEyes

+0

@RedEyes:見編輯回答。 –

3

你在構造函數中隱藏所有的字段。

刪除重新聲明,它將按預期工作。

事情是這樣的:

A(String s) { 
    f = new JFrame(s); 
    f.setVisible(true); 
    f.setSize(400, 400); 
    b = new JButton("OK"); 
    t = new JTextField(); 
    p = new JPanel(); 
    f.add(p); 
    p.setBounds(0, 0, 300, 300); 
    p.add(b); 
    b.setBounds(30, 40, 80, 80); 
    p.add(t); 
    t.setBounds(100, 200, 80, 80); 
    b.addActionListener(this); 
    t.addActionListener(this); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

請注意,我們不會重新聲明任何這些變量的。這就是爲什麼你的活動沒有開火;聲明字段仍然是null

3

而不是做你在做什麼爲什麼你不使用匿名內部類?

喜歡的東西:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

class A { 
    JFrame f; 
    JButton b; 
    JPanel p; 
    JLabel l; 
    JTextField t; 

    A(String s) { 
     f = new JFrame(s); 
     f.setVisible(true); 
     f.setSize(400, 400); 

     p = new JPanel(); 
     p.setBounds(0, 0, 300, 300); 

     t = new JTextField(); 
     t.setBounds(100, 200, 80, 80); 
     p.add(t); 

     b = new JButton("OK"); 
     b.setBounds(30, 40, 80, 80); 
     b.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       t.setText("Hello! World."); 
      } 
     }); 
     p.add(b); 
     f.add(p); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     System.out.println("Hey there"); 
     new A("First App"); 
    } 
} 

我沒有執行這個代碼,但我相信這是要去工作,這種方法會幫助你組織你的代碼更好。 這是我通常的代碼。

如果您使用的是Java 8,那麼使用lambda表達式將是最好的想法,因爲ActionListener是單一抽象方法接口。

如果你想看看使用那麼這是怎麼回事:

b.addActionListener(e -> t.setText("Hello! World.")); 

更好地瞭解,你可以看看這部影片。它適用於JavaFX,但匿名內部類和lambda表達式的概念保持不變。

anonymous inner classes and lambda expressions

+1

我會提出一個很好的建議。 –