2014-12-23 5 views
0

В моем онлайн классе Java, у меня есть этот код:GUI программа не будет работать, как апплет

/* This is option 1 of my Java final project. This is a program which displays a frame with a button that, when you click it, increases the number below it. */ 

import java.awt.*; // imports everything I need for this project 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

public class option1 { // This is where I define most of my stuff. Technical restrictions prevent me from doing this in the class where the program is itself executed (see comment towards the end). 

    public static void main(String[] args) { 

     final Frame mainFrame = new OptionOne(); // First I define my frame, button, and labels ... 
     Button button = new Button("Button"); 
     final Label label1a = new Label(); 
     final Label label1b = new Label(); 
     final Label label1c = new Label(); 
     final Label label2 = new Label(); 

     label1a.setBounds(15, 30, 270, 10); // ... and set their bounds and the labels' text. Labels 1a, 1b, 1c give instructions, while label2 displays the number. 
     label1a.setText("This is a program where you click a button"); 
     label1b.setBounds(15, 45, 270, 10); 
     label1b.setText("and the number below it increases each time"); 
     label1c.setBounds(15, 60, 270, 10); 
     label1c.setText("you click. To start, just click the button."); 
     label2.setBounds(150, 220, 50, 30); 
     label2.setText("0"); 
     button.setBounds(100, 100, 50, 50); 

/* After this point, things get a little more complicated. Technical restrictions on usage of variables accross classes mean that I had to make some unusual code decisions, as you will see. */ 

     label2.addPropertyChangeListener(label2.getText(), new PropertyChangeListener() { // This part is used to detect a change in the appearance of label2, and to react appropriately to it. 
      @Override // All the "@Override"s are here because it gives a compiling error if I don't put them. 
      public void propertyChange(PropertyChangeEvent evt) { 

      } 
     }); 

     button.addMouseListener(new MouseListener() { // This part tells the program what to do when you click the button. 
      @Override // the only @Override that isn't here for technical reasons (see earlier comment at first @Override) 
      public void mouseClicked(MouseEvent e) { 
       int value = Integer.parseInt(label2.getText()); 
       label2.setText(String.valueOf(value + 1)); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 

      } 
     }); 

     mainFrame.add(label1a); // Now that the labels and button are fully defined, we are now ready to add them. 
     mainFrame.add(label1b); 
     mainFrame.add(label1c); 
     mainFrame.add(label2); 
     mainFrame.add(button); 
    } 
} 

class OptionOne extends Frame { // technical restrictions prevent me from putting most of my code in this class. in this code I define the actual frame itself, for its final use. 

    OptionOne() { 
     setTitle("Final Project Option 1"); 
     setSize(300, 300); 
    show(); 
    } 
} 

и мне нужно, чтобы запустить его как апплет. Непосредственно положить его в HTML код, как

<head></head> 
<body> 
<applet code="OptionOne.class" width="300" height="300"> 
</applet> 
</body> 

дает мне ошибку «java.lang.reflect.invocationtargetexception». Почему я получаю эту ошибку? Я знаю, что ошибка должна быть в HTML-коде, потому что программа, когда она помещается в компилятор, отлично работает, так что я делаю неправильно?

EDIT: Теперь у меня есть код изменен на:

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

public class option1main extends Panel { 

    public static void main(String[] args) { 

     Button button = new Button("Button"); 
     final Label label1a = new Label(); 
     final Label label1b = new Label(); 
     final Label label1c = new Label(); 
     final Label label2 = new Label(); 

     label1a.setBounds(15, 30, 270, 10); 
     label1a.setText("This is a program where you click a button"); 
     label1b.setBounds(15, 45, 270, 10); 
     label1b.setText("and the number below it increases each time"); 
     label1c.setBounds(15, 65, 270, 10); 
     label1c.setText("you click. To start, just click the button."); 
     label2.setBounds(150, 220, 50, 30); 
     label2.setText("0"); 
     button.setBounds(100, 100, 50, 50); 

     label2.addPropertyChangeListener(label2.getText(), new PropertyChangeListener() { 
      @Override // All the "@Override"s are here because it gives a compiling error if I don't put them. 
      public void propertyChange(PropertyChangeEvent evt) { 

      } 
     }); 

     button.addMouseListener(new MouseListener() { 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       int value = Integer.parseInt(label2.getText()); 
       label2.setText(String.valueOf(value + 1)); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 

      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 

      @Override 
      public void mouseEntered(MouseEvent e) { 

      } 

      @Override 
      public void mouseExited(MouseEvent e) { 

      } 
     }); 
    } 
} 

public class option1 { 

    option1main() { 
     final Frame mainFrame = new OptionOne(); 
     mainFrame.add(label1a); 
     mainFrame.add(label1b); 
     mainFrame.add(label1c); 
     mainFrame.add(label2); 
     mainFrame.add(button); 
    } 

} 

public class panel1 extends Applet { 

    /* init() { - not sure what to add here...? */ 

} 

class OptionOne extends Frame { 

    OptionOne() { 
     setTitle("Final Project Option 1"); 
     setSize(300, 300); 
    show(); 
    } 
} 

При компиляции он дает мне ошибку, «недействителен объявление метода: тип возвращаемого значения требуется» на линии «option1main() {». Почему это?

+0

Вы правильно прочитали учебники? Вы понимаете, что для отображения апплета класс должен расширяться от «Applet»? Вы понимаете, что существует значительная разница между оконным приложением и апплетом? – MadProgrammer

+0

обновленный пост, теперь у меня другая ошибка – randomguy537

+0

Option1main не является допустимым конструктором или option1 – MadProgrammer

ответ

2
  1. Переместите базовый пользовательский интерфейс в отдельный класс, который простирается от Panel
  2. Позвольте вам текущий (option1) использовать класс этот класс и добавить его в Frame Например, вы создали.
  3. Создайте новый класс, который простирается от Applet. В классах init метод, создать экземпляр класса Panel (с шагом 1) и добавить его в апплет
  4. Измените <applet code="OptionOne.class" width="300" height="300">, чтобы указать на класс апплета, созданный на шаге 3.

Боковые ноты ...

  • Рассмотрите возможность использования свинга или JavaFX, без обид, AWT является 15+ лет из даты, и большинство людей не имеют (или из) опыта работы с ней
  • рассмотреть возможность использования соответствующих менеджеров макетов, чтобы просто вывести с перекрестными различиями в рендеринге платформы
+0

как бы вы сделали номер 2? – randomguy537

+0

Создайте экземпляр пользовательской 'Panel' из опции 1, добавьте ее в' Frame', который вы уже создали в 'option1'. – MadProgrammer

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