Рисование заполненного цветом квадрата в центре кадра, но пользователь выбирает цвет - PullRequest
0 голосов
/ 24 ноября 2018

эта программа должна рисовать заполненный квадрат в центре кадра, но пользователь должен выбрать цвет.Я не знаю, почему это не работает.

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 Ответ

0 голосов
/ 24 ноября 2018
  1. Метод рисования только для рисования.Вы никогда не должны запрашивать ввод в метод рисования.Панель JOptionPane должна отображаться в вашем методе main () при создании компонентов

  2. Метод рисования должен отображать состояние компонента.Например, JLabel рисует текст, когда вы используете метод setText ().Итак, в вашем случае объект Sqaure является свойством вашего SquareComponent, поэтому вам нужен способ добавить Square to you SquareComponent and then you save the Square as a property. Then the paintComponent () method simply paints the Square`.

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

}

Thisвсе еще не лучший дизайн.Было бы неплохо, чтобы ваш SquareComponent мог рисовать несколько объектов Square.Проверьте Индивидуальные подходы к рисованию для дизайна, который позволит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...