Прямоугольники меняют цвета при взаимодействии с - PullRequest
0 голосов
/ 21 марта 2019

Предполагается, что программа создаст сетку, в которой все прямоугольники станут черными, а если щелкнуть или перетащить, они станут белыми.До сих пор моя программа могла сделать прямоугольник, по которому вы щелкаете мышью, или перетаскивать его белым, но он не запоминает и не запоминает, какой из них я щелкнул, чтобы они оставались белыми, пока вы не нажмете их снова.Может быть, я бы назвал изменение, используя прослушиватель мыши, или, возможно, создав LinkedList, я просто не могу найти самое простое решение.

public class Clicky extends JFrame {

private static class Board extends JPanel {

private double BRICK_WIDTH = 20;
private double BRICK_HEIGHT = 20;

public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
public double width = screenSize.getWidth();
public double height = screenSize.getHeight();

private int COLS = (int)(width/BRICK_WIDTH);
private int ROWS =(int)(height/BRICK_HEIGHT);
private Color CO = Color.BLACK;


public Board() {
    System.out.println("WIdth:" + COLS + "Height:" + ROWS);
    setBackground(Color.BLACK);
    addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            mx = e.getX();
            my = e.getY();
            System.out.printf("X: %d Y: %d ", mx, my);
            repaint();
        }
    });

    addMouseMotionListener(new MouseMotionListener() {
        @Override
        public void mouseDragged(MouseEvent e) {
            mx = e.getX();
            my = e.getY();

        }

        @Override
        public void mouseMoved(MouseEvent e) {

        }
    });
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    drawBricks(g);
}


private double x;
private double y;

private void drawBricks(Graphics g) {

    Graphics2D brick = (Graphics2D) g.create();
    x = 0;
    y = 0;
    for (int j = 0; j <= ROWS; j++)
    {
        for (int a = 0; a <= COLS; a++) {
            brick.setColor(Color.BLACK);
            Rectangle2D.Double rect = new Rectangle2D.Double(x, y, BRICK_WIDTH, BRICK_HEIGHT);
            brick.fill(rect);
            if (mx > x && mx < x + BRICK_WIDTH && my > y && my < y + BRICK_HEIGHT) {
                if (brick.getColor() == Color.BLACK) {
                    CO = Color.white;
                    brick.setColor(CO);
                    brick.fill(rect);
                repaint();
                }
                else {
                    CO = Color.BLACK;
                    brick.setColor(CO);
                    brick.fill(rect);
                repaint();
                }
            }


            brick.setColor(Color.gray);
            brick.draw(rect);
            x += BRICK_WIDTH;
        }
        repaint();
        x = 0;
        y += BRICK_HEIGHT;
        }

}
public int mx = -100;
public int my = -100;
}

public Clicky() {

setDefaultCloseOperation(EXIT_ON_CLOSE);    //mai bine cu exit on close
setSize(800, 820);
add(new Board());
}

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        new Clicky().setVisible(true);
    }
});

}

1 Ответ

0 голосов
/ 21 марта 2019

Простым решением является использование двумерного логического массива, который представляет состояние прямоугольников.Когда цвет изменится, измените значение элемента массива и установите цвет в зависимости от него:

public class Clicky extends JFrame {

private static class Board extends JPanel {

    private double BRICK_WIDTH = 20;
    private double BRICK_HEIGHT = 20;

    public Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    public double width = screenSize.getWidth();
    public double height = screenSize.getHeight();

    private int COLS = (int) (width / BRICK_WIDTH);
    private int ROWS = (int) (height / BRICK_HEIGHT);
    private Color CO = Color.BLACK;

    private boolean[][] isWhite = new boolean[COLS + 1][ROWS + 1];

    public Board() {
        System.out.println("WIdth:" + COLS + "Height:" + ROWS);
        setBackground(Color.BLACK);
        addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                mx = e.getX();
                my = e.getY();
                System.out.printf("X: %d Y: %d ", mx, my);
                isWhite[(int) (mx / BRICK_WIDTH)][(int) (my
                        / BRICK_HEIGHT)] = !isWhite[(int) (mx / BRICK_WIDTH)][(int) (my / BRICK_HEIGHT)];
                repaint();
            }
        });

        addMouseMotionListener(new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mx = e.getX();
                my = e.getY();
                isWhite[(int) (mx / BRICK_WIDTH)][(int) (my
                        / BRICK_HEIGHT)] = !isWhite[(int) (mx / BRICK_WIDTH)][(int) (my / BRICK_HEIGHT)];
            }

            @Override
            public void mouseMoved(MouseEvent e) {

            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawBricks(g);
    }

    private double x;
    private double y;

    private void drawBricks(Graphics g) {

        Graphics2D brick = (Graphics2D) g.create();
        x = 0;
        y = 0;
        for (int j = 0; j <= ROWS; j++) {
            for (int a = 0; a <= COLS; a++) {
                if (isWhite[a][j]) {
                    brick.setColor(Color.WHITE);
                } else {
                    brick.setColor(Color.BLACK);
                }
                Rectangle2D.Double rect = new Rectangle2D.Double(x, y, BRICK_WIDTH, BRICK_HEIGHT);
                brick.fill(rect);

                brick.setColor(Color.gray);
                brick.draw(rect);
                x += BRICK_WIDTH;
            }
            repaint();
            x = 0;
            y += BRICK_HEIGHT;
        }

    }

    public int mx = -100;
    public int my = -100;
}

public Clicky() {

    setDefaultCloseOperation(EXIT_ON_CLOSE); // mai bine cu exit on close
    setSize(800, 820);
    add(new Board());
}

public static void main(String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new Clicky().setVisible(true);
        }
    });
}
}
...