2015-11-20 1 views
0

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

import java.util.Scanner; 
import java.awt.Graphics; 
import javax.swing.JApplet; 
public class DrawShapes extends JApplet{ 

    public void paint(Graphics canvas) { 
     Scanner reader = new Scanner(System.in); 
     System.out.println("How many sides do you want your shape to have: "); 
     int sides = reader.nextInt(); 
     reader.close(); 
     super.paint(canvas); 



     if(sides ==4){ 
     canvas.drawRect(100, 50, 200, 200); 
     } 

     System.out.println("Done!"); 

    } 

} 

I вводного этот код и, когда будет предложено ввести как много сторон я want i enter "4"

Новое окно апплета создается в верхнем левом углу без каких-либо ошибок. Но второй попытке расширить апплет следующие ошибки печатаются в консоли:

Exception in thread "AWT-EventQueue-1" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:862) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextInt(Scanner.java:2117) 
    at java.util.Scanner.nextInt(Scanner.java:2076) 
    at DrawShapes.paint(DrawShapes.java:9) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:842) 
    at javax.swing.RepaintManager$4.run(RepaintManager.java:814) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814) 
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738) 
    at javax.swing.RepaintManager.access$1200(RepaintManager.java:64) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

Кроме того, «Applet Started» повторяется в окне апплета, как например: «Applet работы апплета работы Апплет работы апплета работы апплета работы апплета работы апплета работы апплета работы апплета работы апплета работы апплета работы апплета работы Applet Started Applet Started " Что происходит с моим кодом?

+3

Зачем нужен апплет? Если это связано с тем, что учитель указал на это, обратитесь к [Почему учителя CS должны ** останавливаться ** преподавать Java-апплеты] (http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-учебно-ява-апплеты /). –

+0

Да, это для моего класса STEM в средней школе, и книга, которую он дал нам, использует апплеты в своих примерах. –

+0

Не делайте такие вещи, как чтение ввода в методе 'paint()' или 'paintComponent()'. Он будет выполняться каждый раз, когда окно будет перекрашено. (В вашем случае только при изменении размера или открытии) –

ответ

0

Это потому, что всякий раз, когда вы изменяете размер окна, метод paint() будет вызываться снова.

В первый раз вызывается метод, поток будет ждать ввода пользователем с консоли.

После первого раза, нить не будет ждать консольного ввода любой больше, потому что вы закрыли входной поток:

reader.close(); 

Так что либо вы создаете только один экземпляр new Scanner(System.in) и не закрывать его:

public class DrawShapes extends JApplet{ 
    Scanner reader = new Scanner(System.in); // a single instance for the Applet 
    public void paint(Graphics canvas) { 
     super.paint(canvas); // this should be the first statement of the method 
     System.out.println("How many sides do you want your shape to have: "); 
     int sides = reader.nextInt(); 

     if(sides ==4){ 
      canvas.drawRect(100, 50, 200, 200); 
     } 

     System.out.println("Done!"); 
    } 
} 

Или вы заменяете вход консоли на JTextField, так как используете графический интерфейс.

0

Методы окраски предназначены только для окраски! Не делайте ввода-вывода в методе рисования.

Апплеты не предназначены для ввода/вывода файлов. Апплеты выполняются внутри вашего веб-браузера. Командная строка, связанная с броузером, отсутствует.

Если вам нужен пользовательский ввод, вы должны использовать JOptionPane.showInputDialog(...), чтобы запросить пользователя для ввода в методе init(...) апплета. Вы также можете использовать JOptionPane.showMessageDialog(...) для отображения сообщения.

Для получения дополнительной информации ознакомьтесь с разделом из учебника Swing по телефону How to Make Dialogs.

Кроме того, обычная покраска выполняется путем переопределения метода paintCompnent() JPanel, а затем вы добавляете панель в апплет. В учебнике также есть раздел о Custom Painting. Я предлагаю вам прочитать учебник, поскольку он охватывает основы лучше, чем ваш класс, кажется, делает.