2016-03-23 11 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

のActionListener内のJTextFieldとJPanelのを追加しないでください。これは、ボタンが押されるたびに新しいコンポーネントを追加するので意味がありません。 GUI上でsetVisible(true)を呼び出す前に、GUI作成時にそれらを追加してください。次に、ActionListener内のテキストフィールドのテキストを更新します。

サイドの推奨事項:フィールドにコンストラクタを与え、そのコードの大半を静的メインメソッドから取り除くことで、クラスのオブジェクト指向を向上させてください。

2

あなたの過ち:

  1. はないactionPerformed
  2. BorderLayout.CENTERで、run方法でフレームにclicksfirstpanelを追加していないテキストフィールドコンストラクタに、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

関連する問題