2016-04-09 18 views
0

Her biri farklı bir görev yapmak için aynı JFrame üzerinde 2 düğme kullanmak istiyorum. Biri sağdaki etiketi değiştirmek ve ortadaki dairenin rengini değiştirmek için. (Rastgele değişen renk başka bir sınıf üzerindedir.)Program java iç sınıflarını tanımıyor

Bilinmeyen bir nedenden ötürü, program, ana sınıfın içinde bulunan sınıfları (sınıf TwoButtons) tanımak gibi görünmüyor. Java'ya oldukça yeni yaşıyorum ve yanlış yaptığım şeyi bulamıyorum .... Sorunumu çözmek için bana yardımcı olabilir misiniz?

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

public class TwoButtons { 
    JFrame frame; 
    JLabel label; 


    public static void main(String[] args) { 
     TwoButtons gui = new TwoButtons(); 
     gui.go(); 

    } 
    public void go(){ 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton labelButton = new JButton("Change label"); 
     labelButton.addActionListener(new LabelListener()); 

     JButton colorButton = new JButton("Change cirle"); 
     colorButton.addActionListener(new ColorListener()); 

     label = new JLabel("I'm a labele"); 
     MyDrawPanel drawPanel = new MyDrawPanel(); 

     frame.getContentPane().add(BorderLayout.SOUTH, colorButton); 
     frame.getContentPane().add(BorderLayout.CENTER, drawPanel); 
     frame.getContentPane().add(BorderLayout.WEST, labelButton); 
     frame.getContentPane().add(BorderLayout.EAST, label); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 

     class LabelListener implements ActionListener { 
      public void actionPerformed(ActionEvent event) { 
      label.setText("Ouch!"); 

      } 
     } 
     class ColorListener implements ActionListener { 
      public void actionPerformed(ActionEvent event) { 
      frame.repaint(); 
      } 
     } 


     } 


    } 

Ben

labelButton.addActionListener(new LabelListener()); 

bir hata alır ve

colorButton.addActionListener(new ColorListener()); 

üzerine O LabelListener ve ColorListener hem türü olarak çözümlenen olamaz iki olayda diyor.
Önceden çok teşekkür ederiz .. !!

+2

olanlar yerel sınıflardır. Yöntemin içinde beyan edilirler. Onları kullanmadan önce bildirin. – Savior

cevap

2

Sen LabelListener ve ColorListener public void halindeyken dışarı() Yöntemini

012 sınıfları taşımak gerekir

ve

class ColorListener implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     frame.repaint(); 
    } 
} 
1

Java, aşağıdaki gibi yerine go yöntemde bunları tanımlamak, class TwoButtons olan sınıfları ColorListener ve LabelListener tanımlayan deneyin yerine, bunları kullanmak sonra yöntemlerde (yöntem sadece değişken gibi) sınıfları tanımlar, yani olamaz böylece: (Bu genellikle daha iyi bir uygulamadır)

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

public class TwoButtons { 
    JFrame frame; 
    JLabel label; 

    public static void main(String[] args) { 
     TwoButtons gui = new TwoButtons(); 
     gui.go(); 
    } 

    public void go(){ 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JButton labelButton = new JButton("Change label"); 
     labelButton.addActionListener(new LabelListener()); 

     JButton colorButton = new JButton("Change cirle"); 
     colorButton.addActionListener(new ColorListener()); 

     label = new JLabel("I'm a labele"); 
     MyDrawPanel drawPanel = new MyDrawPanel(); 

     frame.getContentPane().add(BorderLayout.SOUTH, colorButton); 
     frame.getContentPane().add(BorderLayout.CENTER, drawPanel); 
     frame.getContentPane().add(BorderLayout.WEST, labelButton); 
     frame.getContentPane().add(BorderLayout.EAST, label); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    class LabelListener implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      label.setText("Ouch!"); 
     } 
    } 

    class ColorListener implements ActionListener { 
     public void actionPerformed(ActionEvent event) { 
      frame.repaint(); 
     } 
    } 
} 
İlgili konular