2016-03-23 127 views
0

我的JPanel和JTextField由於某種原因沒有出現。程序唯一的任務是每次單擊按鈕時向計數器添加一個數字。沒有編譯錯誤和控制檯問題。根本沒有出現?簡單的Java GUI程序

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

public class Swing 
{ 
public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      final JFrame mainFrame = new JFrame ("Counter (Program 1/2)"); 
      mainFrame.setVisible(true); 
      mainFrame.setSize(400, 200); 
      mainFrame.setLayout(new BorderLayout()); 
      mainFrame.setLocationRelativeTo(null); 
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


      JButton countButton = new JButton("Count up"); 
      mainFrame.add(countButton, BorderLayout.SOUTH); 

      countButton.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        JTextField clicks = new JTextField(BorderLayout.CENTER); 
        JPanel firstPanel = new JPanel(); 
        mainFrame.add(firstPanel); 
        mainFrame.add(clicks, BorderLayout.NORTH);  
        int counter = 1; 
        counter++; 
        String textField = String.valueOf(counter); 
        clicks.setText(textField); 

       } 
      });  
     } 
    });  
} 

}

回答

2

不要添加的JTextField和JPanel的的ActionListener的。這是沒有意義的,因爲每次按下按鈕時都會重新添加新組件。在GUI上調用setVisible(true)之前,請將它們添加到GUI創建中。然後更新ActionListener中的文本字段的文本。

作爲一個側面推薦:通過給它一個字段,一個構造函數,並從靜態主方法中獲取大部分代碼,嘗試讓你的類更加面向對象。

2

你的錯誤:

  1. 添加clicksfirstpanel在框架上run方法,而不是在actionPerformed
  2. BorderLayout.CENTER應作爲參數傳遞給add方法,而不是文本字段構造。
  3. 定義計數爲static。這不是最好的方式,但在你的情況下,這是最簡單的方法。
  4. 添加完所有組件後請致電mainFrame.setVisible(true);

這裏是工作代碼:

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

public class Swing { 

    public static int counter = 1; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       final JFrame mainFrame = new JFrame("Counter (Program 1/2)"); 

       mainFrame.setSize(400, 200); 
       mainFrame.setLayout(new BorderLayout()); 
       mainFrame.setLocationRelativeTo(null); 
       mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JButton countButton = new JButton("Count up"); 
       mainFrame.add(countButton, BorderLayout.SOUTH); 

       final JTextField clicks = new JTextField(String.valueOf(counter)); 
       JPanel firstPanel = new JPanel(); 
       mainFrame.add(firstPanel, BorderLayout.CENTER); 
       mainFrame.add(clicks, BorderLayout.NORTH); 

       countButton.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 

         counter++; 
         String textField = String.valueOf(counter); 
         clicks.setText(textField); 

        } 
       }); 

       mainFrame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

投票改變了,謝謝你。 –

+0

非常感謝!有什麼辦法可以將計數器對齊到JTextField的中心嗎? – Dan

+0

'clicks.setHorizo​​ntalAlignment(JTextField.CENTER);'這將完成這項工作。 – rdonuk