2016-03-23 40 views
0

JPanel ve JTextField'ımın bazı nedenleri görünmüyor. Programların sadece görevi, düğmeye her tıklandığında sayaca bir sayı eklemektir. Derleme hataları ve konsol sorunları yok. Sadece gösterilmiyor ??Basit Java GUI Programı

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); 

       } 
      });  
     } 
    });  
} 

}

cevap

2

JTextField ve içindeki Jpanel ActionListener eklemeyin. Bu, düğmeye her basıldığında yeni bileşenleri yeniden ekleyeceğinizden hiçbir anlam ifade etmez. Bunun yerine, GUI'de setVisible(true)'u aramadan önce bunları GUI oluşturmaya ekleyin. Ardından, metin alanının ActionListener'daki metnini güncelleyin.

Yan taraftaki bir öneri olarak: sınıfınızı daha fazla nesne odaklı hale getirerek, alanlara, yapıcılara ve bu kodun çoğunu statik ana yöntemden alıp almaya çalışın.

2

Kişisel hatalar:

  1. değil actionPerformed
  2. BorderLayout.CENTER içinde, run yöntemde çerçeveye clicks ve firstpanel ekle değil metin alanı kurucusuna, add yönteme parametre olarak verilecek edilmelidir .
  3. Sayımı static olarak tanımlayın. Bu en iyi yol değil ama sizin durumunuzda en kolay yol.
  4. Tüm bileşenlerinizi ekledikten sonra mainFrame.setVisible(true);'u arayın. İşte

çalışma kodudur:

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

Oy değişti, teşekkür ederim. –

+0

Çok teşekkür ederim! Sayacı JTextField'ın merkezinde hizalamanın bir yolu var mı? – Dan

+0

'clicks.setHorizontalAlignment (JTextField.CENTER);' bu iş yapacak. – rdonuk