1

私は学校のプロジェクトに取り組んでおり、アプリのユーザーが編集できる 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);
    }
}
4

3 に答える 3

2

paintComponent内でスキャナーやブロッキングコードを使用しないでください。これまで。実際、このブロッキングコードは、Swingイベントスレッドでは呼び出さないでください。特に、paintComponentでは、プログラムのグラフィックスを停止させるため、呼び出す必要があります。ただそれをしないでください。

于 2013-02-08T03:57:43.803 に答える
2

これは(別の)イベントディスパッチスレッドの問題です。

GUIの全体的なポイントを壊すことを除いて、GUIプログラム内からコンソールを介してユーザーに入力を要求しないでください。メインイベント/再描画スレッドをブロックするとどうなるかを経験したことがあります。

Swing(すべてのGUIと同様)はイベント駆動型環境です。ユーザーが何かをクリックまたは入力すると、プログラムがそれに応答します。この形式では、本質的に線形になる傾向があるコンソールプログラムとは異なります。

Swingは、単一のスレッドを使用して、ペイントとイベント通知のすべてを実行します。このスレッドの実行を停止する何かを行うと、アプリケーションがハングして応答しなくなったように見えます。

まず、Swingを使用したGUIの作成を読んでから、カスタムペインティングの実行を読んでください。最後に、AWTとSwingでのペインティングを確認することを強くお勧めします。

簡単な例

ここに画像の説明を入力してください

于 2013-02-08T03:57:57.720 に答える
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;
    }

}

これがポイントを得るのに役立つことを願っています。そして、それは機能します。

于 2013-02-08T04:42:44.360 に答える