我的代码似乎在循环,我不知道为什么

时间:2016-09-29 03:10:17

标签: java swing awt

我正在编写一个程序,用于绘制不同状态的对象。第一个是灰色矩形,第二个是图像,第三个是带有文本的较亮矩形。我把代码编写为3个类。我的组件类有问题。它由于某种原因不断循环。当我输入1时,它工作正常。当我输入2时,它在显示图像之前要求我输入4次。当我输入3时,它会在显示较亮的矩形之前询问两次,但它没有任何文本。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Scanner;

import javax.swing.JComponent;

public class ImageComponent extends JComponent {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public int status;

    public int getInput(){  
    Scanner userinput = new Scanner(System.in);
    System.out.println("Select the state <1-rectangle, 2-image, 3-rectangle with text>");
    int state=userinput.nextInt();
    //userinput.close();
    return state;
    }

    public void paintComponent(Graphics g){
        Graphics2D g2 =(Graphics2D) g;

        if (getInput() ==1){
            ImageMaker rectangle = new ImageMaker(0,0,500,400);
            g2.setColor(Color.GRAY);
            rectangle.draw(g2);

        }
        else if (getInput() ==2){
            Image img1 = Toolkit.getDefaultToolkit().getImage("balloon.gif");
            ImageMaker image = new ImageMaker(img1, 0, 0, this);
            image.draw(g2);
        }
        else{
            ImageMaker rectangle = new ImageMaker(0,0,500,400);
            g2.setColor(Color.LIGHT_GRAY);
            rectangle.draw(g2);
            g2.drawString("Your Text Here", 500/2, 400/2);
        }   
    }

}

3 个答案:

答案 0 :(得分:3)

我无法确定问题的确切原因,因为您尚未发布有效的minimal example program(请查看链接以了解我的意思),但我有几个怀疑我会转发给你:

  • 你将Scanner初始化为System.in,一个从控制台获取输入的工具,使用Swing GUI,两个不能很好地混合在一起的东西,不应该好好混合在一起。扫描仪输入方法可以阻止程序流程,可以完全冻结您的Swing GUI。
  • 你似乎在paintComponent中做了比你应该做的更多的事情。此方法仅用于绘画和绘画,不应用于文件输入/输出(如图像读取),程序逻辑或创建GUI组件。

答案 1 :(得分:2)

  

当我输入1时,它工作正常。当我输入2时,它在显示图像之前要求我输入4次。当我输入3时,它会在显示较亮的矩形之前询问两次,但它没有任何文本。

您正在放置一个方法getInput(),该方法会提示您使用扫描仪进入paintComponent。尽量不要在paintComponent方法中放置任何其他内容,除了与绘画相关的任务。油漆管理器将决定何时调用paintComponent本身,而您无法完全控制它。 (例如,当您调整框架大小/鼠标悬停时,可能会调用它,导致提示的调用次数超出您的预期)。

我建议你将提示用户和绘制组件的逻辑分开。此外,您应该避免使用Scanner与自定义绘画混合。

您可以考虑使用对话框:How to make Dialogs

答案 2 :(得分:0)

首先:正如@ Hovercraft-Full-Of-Eels已经注意到:paintComponent用于绘制您的组件,而非用于用户交互。

只要认为重新绘制UI所需的时间,就会从swing调用此方法 - 例如,在您的框架被某个其他窗口遮挡并再次显示之后。

第二点是

if (getInput() ==1){

要求用户输入。如果用户输入2,则不满足条件,并且

else if (getInput() ==2){

你是第二次要求用户输入。

如果您的决策链依赖于交互式用户输入,那么它应该类似于

int input = getInput();
if (input == 1) {
    //...
} else if (input == 2) {
    //...
} else {
    //...
}

switch (getInput()) {
case 1:
    //...
    break;
case 2:
    //...
    break;
default:
    //...
    break;
}