ошибка при запуске простой свинг-программы - PullRequest
0 голосов
/ 06 августа 2010

я только начал изучать качели. И думал попробовать простую программу, но я не могу ее запустить.

import java.awt.*;
import javax.swing.*;
class MyDrawPanel extends JPanel 
{
    public void paintComponent(Graphics g) 
    {
        g.setColor(Color.orange);
        g.fillRect(20,50,100,100);
    }
}

Я получаю следующую ошибку:

Exception in thread "main" java.lang.NoSuchMethodError: main

Мой вопрос: нужен ли нам метод main в каждом классе, который мы хотим запустить? JVM не может запустить ни один класс, у которого нет метода main. Здесь я не нуждаюсь в основном классе, я думаю, потому что этот метод paintComponent должен вызываться системой, верно?

P.S .: Я использую простой ванильный cmd для компиляции и запуска.

Ответы [ 4 ]

1 голос
/ 06 августа 2010

Java довольно прост, когда вы даете ему файл класса, он загружает его и пытается выполнить программу.Java-программы определены для запуска в методе public static void main (String ... args).Таким образом, файл класса, в котором отсутствует эта функция, не имеет допустимой точки входа для программы.

Чтобы заставить java вызывать ваш метод paintComponent (), вам нужно добавить экземпляр вашего класса в контейнер верхнего уровня, такой как JFrame или для веб-приложенийЯплет.(Апплеты не используют основной метод, поскольку они выполняются как часть веб-страницы, а не как отдельное приложение.)

Пример:

import javax.swing.*
public class MyDrawPanel{
     public static void main(String... args)
     {
         JFrame frame = new JFrame(200,200);//A window with 200x200 pixel
         MyDrawPanel mdp = new MyDrawPanel();//Panel instance
         frame.add(mdp);//Add the panel to the window
         frame.setVisible(true);//Display all
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//exit when the window is closed

     }
}
1 голос
/ 06 августа 2010

Как сказал водханг, вам нужен "основной" метод. Убедитесь, что это выглядит так:

public static void main(String[] args)
{
  // your code here.  
  // this example will use your panel:

  // create a new MyDrawPanel 
  MyDrawPanel panel = new MyDrawPanel();

  // create a frame to put it in
  JFrame f = new JFrame("Test Frame");
  f.getContentPane().add(panel);

  // make sure closing the frame ends this application
  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  // show the frame
  f.setSize(100,100);
  f.setVisible(true);

}

Да, каждая Java-программа, которую вы хотите запустить, нуждается в основном методе с именно такой сигнатурой:

  public static void main(String[] args)

Вы можете запускать java-код из других систем (например, веб-серверов и т. Д. Без «main»), но для его запуска основным является точка входа. Поместите его в любое место, где вы хотите запустить программу.

Во время работы убедитесь, что вы правильно указали имя класса, чтобы помочь ему найти ваш основной метод. В вашем случае, если вы запускаете Java вручную в том же каталоге, что и ваш файл MyDrawPanel.class, вы должны сделать это:

  java -cp . MyDrawPanel

Если вы работаете из инструмента разработчика, то он обеспечит способ запуска класса, на который вы смотрите.

1 голос
/ 06 августа 2010

Нужен ли нам основной метод в каждый класс, который мы хотим запустить?

Вам нужен класс с методом main для запуска JVM.

JVM не может запустить ни один класс, у которого нет метода main.

Не изначально.

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

Неправильно. Это правда, что метод paintComponent() будет в конечном итоге вызываться "системой", в частности потоком обработки событий Swing. Но это нужно сначала запустить, что происходит неявно, когда вы создаете окно и делаете его видимым. А это, в свою очередь, может произойти только в основном методе.

0 голосов
/ 06 августа 2010

Вам нужен метод main в классе, для которого вы хотите запустить программу. Это обязательно. Как JVM может узнать, какой метод следует вызвать, если у вас есть несколько методов. Они могут догадываться, но в большинстве случаев догадка может пойти не так. Итак, предоставить простой метод main поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...