在框架的中心绘制一个颜色填充的正方形,但颜色由用户决定



这个程序应该在框架的中心画一个填充的正方形,但用户必须决定颜色。我不知道为什么它不起作用。

SquareComponent.java

import java.awt.Graphics; 
import java.awt.Graphics2D;
import javax.swing.JComponent;
import java.awt.Color;
import javax.swing.JOptionPane;
public class SquareComponent extends JComponent{
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
String input = JOptionPane.showInputDialog("Enter a color");
switch(input.toLowerCase()) {
case "black":   Square s = new Square(Color.BLACK);
s.draw(g2);
break;
case "blue":    Square s1 = new Square(Color.BLUE);
s1.draw(g2);
break;
case "cyan":    Square s2 = new Quadrato(Color.CYAN);
s2.draw(g2);
break;
case "gray":    Square s3 = new Square(Color.GRAY);
s3.draw(g2);
break;
case "light gray":  Square s4 = new Square(Color.LIGHT_GRAY);
s4.draw(g2);
break;
default: Square s5 = new Square(Color.PINK);
s5.draw(g2);
}
}
}

Square.java

import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Color;
public class Square{
public Square(Color color) {
this.color = color;
}
public void draw(Graphics2D g2) {
Rectangle box = new Rectangle(20, 20, 130, 180);
g2.draw(box);
g2.setColor(color);
g2.fill(box);
}
private Color color;
}

SquareViewer.java

import javax.swing.JFrame;
public class SquareViewer{
public static void main(String[] args){
JFrame frame = new JFrame();
final int FRAME_WIDTH = 300;
final int FRAME_HEIGHT = 400;
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setTitle("Square");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SquareComponent component = new SquareComponent();
frame.add(component);
frame.setVisible(true);
}
}

如果运行SquareViewer,则会显示JOptionPane。例如,我写"黑色"。它显示了一个黑色正方形,但背景是JOptionPane。为什么它不能正常工作?

  1. 绘画方法仅用于绘画。在绘制方法中永远不应该提示输入。创建组件时,JOptionPane应该显示在main((方法中

  2. 绘制方法应该绘制组件的状态。例如,当您使用setText((方法时,JLabel会绘制文本。因此,在您的情况下,Sqaure对象是SquareComponent的属性,因此您需要一种方法来添加Square to youSquareComponentand then you save the Square as a property. Then thepaintComponent((method simply paints theSquare`。

  3. 在进行自定义绘制之前,您的绘制方法应始终清除背景。您没有,这可能就是您看到JOptionPane的原因,因为该区域尚未清除。在下面的例子中,我扩展了一个JPanel,因为它具有默认功能,可以在调用super.paintComponent((.时清除背景

您的SquareComponent类可能类似于:

public class SquareComponent extends JPanel
{
private Square square;
public SquareComponent(Square square)
{
this.square = square;
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
square.draw(g);
}
}

然后在main()方法中,您可以执行以下操作:

Square square = getSquareColor();
SquareComponent component = new SquareComponent(square);
frame.add(component);

getSquareColor()方法类似于

private static Square getSquareColor()
{
String input = JOptionPane.showInputDialog("Enter a color");
switch(input.toLowerCase()) {
case "black":   return new Square(Color.BLACK);
case "blue":    return new Square(Color.BLUE);
...
}
return = new Square(Color.PINK);
}

这仍然不是最好的设计。如果您的SquareComponent能够绘制多个Square对象,我会很高兴。查看自定义绘画方法的设计将允许这一点。

相关内容

最新更新