2013-07-15 3 views
2

Я начинающий Java-программист, пытающийся реализовать ActionListener через класс Inner. Ниже приведен простой код, в котором я хочу изменить текст метки при нажатии кнопки, но вместо использования getSource для нескольких компонентов я хочу использовать Inner Class. Вот мой код:ActionPerfomed Метод не работает во внутреннем классе

public class InnerClasses extends JPanel { 

    static JFrame frame ;  
    static JButton button ; 
    static JLabel label ; 
    public static void main(String[] args) {  
     InnerClasses i= new InnerClasses();  
     frame= new JFrame("Inner class"); 
     frame.setSize(400,400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
     frame.add(i); 
     label = new JLabel(BorderLayout.NORTH); 
     label.setText("I m label"); 
     i.add(label);  
     button = new JButton(BorderLayout.SOUTH); 
     button.setText("Click me "); 
     button.addActionListener(new innerclass()); 
     i.add(button); 
     frame.setVisible(true); 
    } 

    class innerclass implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent arg0) {  
      label.setText("i have been changed"); 
     }  
    } 

теперь, когда я пытаюсь зарегистрировать слушатель кнопку дает ошибке

Нет ограждающий экземпляр InnerClasses типа не доступен. Должно быть присвоено распределение с прилагаемым экземпляром типа InnerClasses (например, x.new A(), где x является экземпляром InnerClasses).

Пожалуйста, помогите мне с ним, если я делаю что-то agaisnt синтаксису или что случилось здесь

+0

Возможный дубликат [Java - Нет ограждающих экземпляра типа Foo доступен] (http://stackoverflow.com/questions/9560600/java-no-enclo sing-instance-of-type-foo-is-available) – fabian

ответ

2
  • для создания любого графического интерфейса требуется какая-то иерархия, основанный на Oracle tutorials и хорошие practicies, код заказ может быть важным

  • не создавать какие-либо Качели GUI объектов внутри основных методов

  • Я не могу нашел никаких оснований объявлять ничего статического в Java

, например

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class InnerClasses { 

    private JFrame frame; 
    private JPanel panel; 
    private JButton button; 
    private JLabel label; 

    public InnerClasses() { 
     label = new JLabel(); 
     label.setText("I m label"); 
     button = new JButton(); 
     button.setText("Click me "); 
     button.addActionListener(new MyActioListener()); 
     panel = new JPanel(); 
     panel.add(label); 
     panel.add(button); 
     frame = new JFrame("Inner class"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 

    class MyActioListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      label.setText("i have been changed"); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       InnerClasses innerClasses = new InnerClasses(); 
      } 
     }); 
    } 
} 
+0

есть проблема таким образом, если я помещаю фрейм и т. Д. В экземпляр Constructor i cant pass из моего класса (InnerClasses innerClasses = new innerClasses();) в frame.add (innerClasses) // это дает ошибку –

+1

@JavaStudent: В этом случае просто используйте 'frame.add (this)', так как ваш 'InnerClasses' расширяет' JPanel', поэтому нет необходимости создавать объект 'InnerClasses', вместо этого используйте ключевое слово this this для этой же цели :-) +1 к ответу, который появится через 10 часов :( –

3

Ваш внутренний класс не является статическим, так что вы не можете создать его экземпляр от статического метода, и в общем, лучше определить внутренние классы как статические, в противном случае нового класса (не экземпляр) будет создаваться для каждого экземпляра класса ограждающего:

static class Innerclass implements ActionListener 
+0

да, он решил мою проблему, объясните, что вы подразумеваете под «иначе для каждого экземпляра охватывающего класса будет создан новый класс (не экземпляр):« –

+1

Ejaaaactly, случай, изучая C# сейчас несколько дней, поэтому запутался, на каком языке, по умолчанию внутренний класс статичен. Этот ответ действительно освежил мою память в этом отношении :-) +1, к этому, хотя мой голос будет приходить через 10 часов :( –

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