我正在尝试创建一个可以绘制矩形的简单applet,我有以下代码:
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!");
}
}
我运行此代码,当提示输入我想要输入“4”
的边数时然后在左上角创建一个新的applet窗口,没有任何错误。 但是,第二次尝试扩展applet时,会将以下错误打印到控制台:
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窗口中重复“Applet Started”,如下所示: “小程序开始了 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始“ 我的代码怎么了?
答案 0 :(得分:0)
这是因为无论何时调整窗口大小,都会再次调用paint()
方法。
第一次调用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!");
}
}
或者您使用GUI替换控制台输入和JTextField。
答案 1 :(得分:0)
绘画方法仅限绘画!不要在绘画方法中进行I / O.
Applet不是为进行文件I / O而设计的。小程序在Web浏览器中执行。没有与浏览器关联的命令行。
如果您需要用户输入,那么您应该使用init(...)
提示用户输入applet的JOptionPane.showMessageDialog(...)
方法。您还可以使用Custom Painting
来显示消息。
阅读How to Make Dialogs上的Swing教程中的部分以获取更多信息。
此外,通过覆盖JPanel的paintCompnent()方法完成自定义绘制,然后将面板添加到applet。本教程还有一个关于{{1}}的部分。我建议你阅读教程,因为它比你的课程似乎更好地涵盖了基础知识。