2013-02-08 72 views
1

我正在学校项目上工作,我必须在Java中创建一个人脸,以便我的应用程序的用户可以编辑它。每个面部特征都应该有几个选项,所以我试着做的第一个就是眼睛。然而,当我尝试与eyeComponent类中的用户交互时,我遇到了麻烦。Java中图形的问题

它在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); 
    } 
} 

回答

2

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

2

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

你应该永远不要从GUI程序中通过控制台请求用户的输入,除了突破GUI的全部要点之外,你知道遇到阻塞主事件/重绘线程时会发生什么情况。

Swing(与所有GUI一样)都是事件驱动的环境。用户点击或键入内容,程序会对其作出响应。在这种形式下,它们不像控制台程序,它本质上往往更线性。

Swing使用一个线程来执行它的所有绘画和事件通知。做任何阻止此线程运行的东西都会导致您的应用程序显示为挂起并变得无法响应。

开始通过具有Creating GUIs with Swing读取,然后有Performing Custom Painting读,最后我会强烈建议你看看Painting in AWT and Swing

简单的例子

enter image description here

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; 
    } 

} 

希望这有助于拿到一分。它的工作原理。