2016-03-23 3 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) в графическом интерфейсе. Затем обновите текст текстового поля в ActionListener.

В качестве побочной рекомендации: попробуйте сделать свой класс более ориентированным на объект, предоставив ему поля, конструктор и получив большинство всего этого кода из статического основного метода.

2

Ваши ошибки:

  1. Добавить clicks и firstpanel к раме в 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.setHorizontalAlignment (JTextField.CENTER);' это выполнит эту работу. – rdonuk

Смежные вопросы