анонимный внутренний класс - недопустимое начало выражения

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

Lab2Part2.java:25: ошибка: недопустимое начало выражения public void actionPerformed(ActionEvent e) ^ Lab2Part2.java:25: ошибка: незаконное начало выражения public void actionPerformed(ActionEvent e) ^ Lab2Part2.java:25: error: '; ' ожидаемое публичное недействительное действиеPerformed(ActionEvent e) ^ Lab2Part2.java:25: ошибка: ';' ожидаемое публичное действие voidPerformed (ActionEvent e)

Вот код:

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

    public class Lab2Part2 extends JFrame implements ActionListener
    {  

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

   public Lab2Part2()
   {
      setLayout(new GridLayout());
      frame = new JFrame();
      button = new JButton("Let's start this show");
      panel = new JPanel();
      panel.add(button);

      InnerProgress prog1 = new InnerProgress("Progress 1: ");
      InnerProgress prog2 = new InnerProgress("Progress 2: ");

      button.addActionListener(new ActionListener());

      //this is where it throws errors
      public void actionPerformed(ActionEvent e)
      {  
      Object source = e.getSource();
      if(source == button)
      {
      Thread th1 = new Thread(prog1);
      Thread th2 = new Thread(prog2);
      th1.start();
      th2.start();
      }
   } 

  add(panel);
  add(prog1);
  add(prog2);   



  setVisible(true);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setLocationRelativeTo(null);
  pack();
   }

   public static void main(String [] args)
   {
   new Lab2Part2();
   }  

   class InnerProgress extends JPanel implements Runnable
   {
   private String progress;
   private JProgressBar bar;

   public InnerProgress(String _progress)
   {
      progress = _progress;
      add(bar);
   }  

   public void run()
   {  
      System.out.println("We are running: " + progress);
   }
 }  
}

person Community    schedule 17.02.2016    source источник


Ответы (2)


Вы перепутали свой код и в конечном итоге получили методы внутри методов.

          button.addActionListener(new ActionListener());

          //this is where it throws errors
          public void actionPerformed(ActionEvent e)
          {  
          Object source = e.getSource();
          if(source == button)
          {
          Thread th1 = new Thread(prog1);
          Thread th2 = new Thread(prog2);
          th1.start();
          th2.start();
          }
       } 

Весь этот метод actionPerformed на самом деле должен быть в анонимном внутреннем классе, но это не так.

      button.addActionListener(new ActionListener(){

      //this is where it throws errors
      public void actionPerformed(ActionEvent e)
      {  
      Object source = e.getSource();
      if(source == button)
      {
      Thread th1 = new Thread(prog1);
      Thread th2 = new Thread(prog2);
      th1.start();
      th2.start();
      }
   }); 

сохраняет ваш метод в анонимной реализации.

person Stultuske    schedule 17.02.2016

Посмотрите именно в эти строки:

button.addActionListener(new ActionListener());

//this is where it throws errors
public void actionPerformed(ActionEvent e) {  
    Object source = e.getSource();
    if (source == button) {
        Thread th1 = new Thread(prog1);
        Thread th2 = new Thread(prog2);
        th1.start();
        th2.start();
    }
}

Здесь вы создаете экземпляр интерфейса, что запрещено, а затем создаете метод в теле другого метода, что также запрещено.

Конечно, это не то, что вы хотели сделать.

Наверняка вы хотели реализовать actionPerformer внутри этого ActionListener и это делается так:

button.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent e) {  
      Object source = e.getSource();
      if(source == button) {
          Thread th1 = new Thread(prog1);
          Thread th2 = new Thread(prog2);
          th1.start();
          th2.start();
      }

});
person Dmitry Ginzburg    schedule 17.02.2016
comment
«создание нового интерфейса»... нет, он создает новый интерфейс. на самом деле, он пытается создать анонимную реализацию, которая вообще не запрещена. - person Stultuske; 17.02.2016
comment
@Stultuske да, эта формулировка лучше. - person Dmitry Ginzburg; 17.02.2016
comment
@Stultuske, создание анонимной реализации без самой реализации, безусловно, запрещено. - person Dmitry Ginzburg; 17.02.2016
comment
Я никогда не говорил, что это не так. но создание экземпляра (анонимной реализации) интерфейса не запрещено. Судя по твоему сообщению, есть. - person Stultuske; 17.02.2016
comment
@Stultuske, если у вас есть идея, как объяснить этот факт более ясно, вы можете предложить правку. - person Dmitry Ginzburg; 17.02.2016