我正在编写一个程序,用于绘制不同状态的对象。第一个是灰色矩形,第二个是图像,第三个是带有文本的较亮矩形。我把代码编写为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);
}
}
}
答案 0 :(得分:3)
我无法确定问题的确切原因,因为您尚未发布有效的minimal example program(请查看链接以了解我的意思),但我有几个怀疑我会转发给你:
答案 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;
}