2016-09-05 2 views
0

Возможно, это был глупый вопрос, но я не мог понять синтаксис в классе «Mainframe», как показано на картинке: Here, the setStringListener method is called from toolbar reference. But the syntax used inside the circular bracket is quite weird to me. I usually have parameters like strings or reference inside the call method. I did not understand how JButton will call this method. This programms works fine. I jst dont understand that part Весь исходный код напечатан ниже.о методах вызова и JButtons

public class App { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run() { 

      new MainFrame(); 
     } 
    }); 
}} 




public class MainFrame extends JFrame{ 
private TextPanel textPanel; 
private Toolbar toolbar; 
public MainFrame(){ 
    super("Hello World"); 
    setLayout(new BorderLayout()); 
    toolbar =new Toolbar(); 
    textPanel=new TextPanel(); 
    toolbar.setStringListener(new StringListener(){    
     public void textEmitted(String text){ 
      textPanel.appendText(text); 
     } 
    }); 

    add(toolbar,BorderLayout.NORTH); 
    add(textPanel,BorderLayout.CENTER); 
    setSize(600, 500); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
}} 




public class TextPanel extends JPanel { 
private JTextArea textArea; 

public TextPanel(){ 
    textArea=new JTextArea(); 

    setLayout(new BorderLayout()); 
    add(new JScrollPane(textArea),BorderLayout.CENTER); 
} 

public void appendText(String text){ 
    textArea.append(text); 
}} 



public class Toolbar extends JPanel implements ActionListener { 
private JButton helloButton; 
private JButton goodbyeButton; 
private StringListener textListener; 
public Toolbar(){ 
    helloButton=new JButton("Hello"); 
    goodbyeButton=new JButton("Goodbye"); 

    helloButton.addActionListener(this); 
    goodbyeButton.addActionListener(this); 


    setLayout(new FlowLayout(FlowLayout.LEFT)); 
    add(helloButton); 
    add(goodbyeButton); 
} 
public void setStringListener(StringListener listener){ 
    this.textListener=listener; 
} 
public void actionPerformed(ActionEvent e) { 
    JButton clicked=(JButton)e.getSource(); 
    if (clicked==helloButton){ 
     if (textListener!=null){ 
      textListener.textEmitted("Hello\n"); 
     } 
    } 
    else if(clicked==goodbyeButton){ 
     if (textListener!=null){ 
      textListener.textEmitted("goodBye\n"); 
     }   
    }  
}} 

И интерфейс StringListener

public interface StringListener { 
public void textEmitted(String text); 

}

+0

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#syntax-of-anonymous-classes –

ответ

0

Поскольку вы, по сути создавая интерфейс new внутри метода setStringListener(), вам нужно иметь реализацию.


Вы можете себе представить, что вы уже определили интерфейс с реализацией метода textEmitted():

public class MyImplementation implements StringListener { 

    @Override 
    public void textEmitted(String text) { 
     // Do stuff here 
    } 
} 

Теперь, вместо определения этого интерфейса отдельно, вы можете создать в новой StringListener ваш MainFrame класс:

StringListener myImplementation = new StringListener() { 

    @Override 
    public void textEmitted(String text) { 
     // Do stuff here 
    } 
}; 

toolbar.setStringListener(myImplementation); 

Так что вы «повторно делать это basicall у такой же, как приведенный выше код, но создавая StringListener внутри вашего метода вместо определения его отдельно:

toolbar.setStringListener(new StringListener() { 
    @Override 
    public void textEmitted(String text) { 
     // Do stuff here 
    } 
}); 

Я надеюсь, что эти примеры помогут.

Если вы все еще не уверены, я настоятельно рекомендую прочитать через Java tutorial for Anonymous Classes.

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