在Java applet中绘制一个矩形

时间:2015-11-20 15:02:08

标签: java swing applet awt

我正在尝试创建一个可以绘制矩形的简单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”,如下所示: “小程序开始了 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始 小程序开始“ 我的代码怎么了?

2 个答案:

答案 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}}的部分。我建议你阅读教程,因为它比你的课程似乎更好地涵盖了基础知识。

相关问题