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