Java中的图形问题

时间:2013-02-08 03:48:38

标签: java graphics java.util.scanner

我正在开展一个学校项目,我必须在java中创建一个人脸,我的应用程序的用户可以编辑。每个面部特征应该有几个选项,所以我尝试的第一个是眼睛。但是,当我尝试与eyeComponent类中的用户进行交互时,我遇到了麻烦。

它在JVM中打印用户颜色选项(1-4),并打开一个空白的JFrame窗口,但在JVM中,它不允许用户的响应。在打印出颜色选项后,程序就结束了,我不确定为什么它不允许用户响应。我在下面发布了EyeComponent和PersonViewer类的代码。

EyeComponent

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
import java.util.Scanner;  

public class EyeComponent extends JComponent
  { 
    public void paintComponent(Graphics g)
  {
    Scanner in = new Scanner(System.in);
    Graphics2D g2 = (Graphics2D) g;
    Ellipse2D.Double head = new Ellipse2D.Double(5,20,100,150);
    System.out.println("What color would you like the eyes to be?"); 
    System.out.println("Select \n1:blue \n2:red \n3:yellow \n4:green"); 
    int response = in.nextInt(); 
    if (response == 1)
        { g2.setColor(Color.BLUE);}
        else if (response == 2)
        { g2.setColor(Color.RED);}
    else if (response == 3)
        { g2.setColor(Color.YELLOW);}
    else if (response == 4)
        { g2.setColor(Color.GREEN);}
    g2.draw(head); 
 }   
}

PersonViewer

import javax.swing.*;
import java.util.Scanner;
public class personViewer //creates class called engine of scope public
  {
     public static void main (String [] args) //main method for engine class
     {
        JFrame frame = new JFrame();
        frame.setSize(150, 250);
        frame.setTitle("Face");
        EyeComponent component = new EyeComponent();
        frame.add(component);
        frame.setVisible(true);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

3 个答案:

答案 0 :(得分:2)

切勿在paintComponent中使用扫描仪或任何阻止代码。永远。事实上,永远不应该在Swing事件线程上调用这个阻塞代码,但在paintComponent中尤其如此,因为它会将程序的图形停止。只是不要这样做。

答案 1 :(得分:2)

这是(另一个)事件调度线程问题。

你不应该在GUI程序中通过控制台向用户请求输入,除了打破GUI的整个点,你知道在阻止主事件/重绘线程时会发生什么。

Swing(与所有GUI一样)是事件驱动的环境。用户点击或输入内容,程序会响应它。在这种形式中,它们与控制台程序不同,后者本质上更具线性。

Swing使用单个线程来执行它的所有绘画和事件通知。执行任何阻止此线程运行的操作都会导致应用程序显示为挂起并且无响应。

首先阅读Creating GUIs with Swing,然后阅读Performing Custom Painting,最后我强烈建议您查看Painting in AWT and Swing

简单示例

enter image description here

答案 2 :(得分:0)

请勿使用您无法控制的方法使用扫描仪。 我重构了一些代码以更多的OOP方法。

    import javax.swing.*;

import java.awt.Color;
import java.util.Scanner;

public class PersonViewer // creates class called engine of scope public
{

    public static void main(String[] args) // main method for engine class
    {

        Configurator conf = Configurator.getInstance();
        Scanner in = new Scanner(System.in);
        System.out.println("What color would you like the eyes to be?");
        System.out.println("Select \n1:blue \n2:red \n3:yellow \n4:green");
        int response = in.nextInt();
        switch (response) {
        case 1:
            conf.setEyeColor(Color.BLUE);
            break;
        case 2:
            conf.setEyeColor(Color.RED);
            break;
        case 3:
            conf.setEyeColor(Color.YELLOW);
            break;
        case 4:
            conf.setEyeColor(Color.GREEN);
            break;

        }
        JFrame frame = new JFrame();
        frame.setSize(150, 250);
        frame.setTitle("Face");
        EyeComponent component = new EyeComponent();
        frame.add(component);
        frame.setVisible(true);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

    import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

import javax.swing.JComponent;

public class EyeComponent extends JComponent {

    Configurator conf = Configurator.getInstance();

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D.Double head = new Ellipse2D.Double(5, 20, 100, 150);
        g2.setColor(conf.getEyeColor());
        System.out.println(conf.getEyeColor());
        g2.draw(head);
    }
}

    import java.awt.Color;


public class Configurator {

    private static Configurator instance = null;
    public static Configurator getInstance() {
        if (instance==null) {
            instance = new Configurator();
            System.out.println("first called");
        }
        else {
            System.out.println("next calls");
        }
        return instance;
    }
    private Color eyeColor;

    public Color getEyeColor() {
        return eyeColor;
    }

    public void setEyeColor(Color eyeColor) {
        this.eyeColor = eyeColor;
    }

}

希望这有助于说明问题。它有效。