При двойном щелчке круг должен исчезнуть - PullRequest
1 голос
/ 17 марта 2019

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

Я пытался перекрасить круг в тот же цвет, что и фон в реализованном методе, нажатием мыши, но это было не очень эффективно.Он только «исчезает» при нажатии, но я хочу, чтобы он исчез при нажатии.

Я написал это нажатием мышки, потому что я не знал, как использовать это в щелчке мышью.

image

Вот мой код:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;

/**
 * In this program, when user clicks a square, a circle appears until the user clicks it again.
 */
public class DD_GridFiller extends JFrame {

    private int gridRows;
    private int gridColumns;

    private Color[][] circleColor;  //color of circles
    private Color lineColor;       //color of lines

    /**
     * constructor
     */
    public DD_GridFiller() {
        setTitle("My Grid Filler");
        setSize(600,600);
        setLayout(new GridLayout(4,4));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        circleColor = new Color[4][4]; //stores the colors in arrays
        gridRows = 4;
        gridColumns = 4;
        lineColor = Color.RED;
        setPreferredSize( new Dimension(90*4, 90*4) );
        setBackground(Color.BLACK); // set the background color for this panel.
        addMouseListener(new MouseListener());

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int top, left;  // position for top left corner of the window
        left = ( screenSize.width - getWidth() ) / 2;
        top = ( screenSize.height - getHeight() ) / 2;
        setLocation(left,top);
        setResizable(false);

        setVisible(true);
        pack();
    }

    public void paint(Graphics g) {
        g.setColor(getBackground());
        g.fillRect(0,0,getWidth(),getHeight());
        int row, col;
        double cellWidth = (double)getWidth() / gridColumns;  //get cell width
        double cellHeight = (double)getHeight() / gridRows;   //get cell height

        //create circles in every cell
        for (row = 0; row < gridRows; row++) {
            for (col = 0; col < gridColumns; col++) {
                if (circleColor[row][col] != null) {
                    int x1 = (int)(col*cellWidth);
                    int y1 = (int)(row*cellHeight);
                    g.setColor(circleColor[row][col]);
                    g.fillOval(x1-2, y1-2, 23*4, 23*4);
                }
            }
        }
        //CREATES THE LINES
        if (lineColor != null) {
            g.setColor(lineColor);
            for (row = 1; row < gridRows; row++) {
                int y = (int)(row*cellHeight);
                g.drawLine(0,y,getWidth(),y);
            }
            for (col = 1; col < gridRows; col++) {
                int x = (int)(col*cellWidth);
                g.drawLine(x,0,x,getHeight());
            }
        }
    }
    /**
     * Finds the row
     * @param pixelY location on x-axis
     * @return rows
     */
    private int findRow(int pixelY) {
        return (int)(((double)pixelY)/getHeight()*gridRows);
    }

    /**
     * Finds the column
     * @param pixelX location of y-axis
     * @return columns
     */
    private int findColumn(int pixelX) {
        return (int)(((double)pixelX)/getWidth()* gridColumns);
    }

    private class MouseListener implements java.awt.event.MouseListener {
         @Override
    public void mouseClicked(MouseEvent e) {
        int row, col; // the row and column in the grid of squares where the user clicked.
        row = findRow( e.getY() ); col = findColumn( e.getX() );  //find the location of cells clicked

        circleColor[row][col] = new Color(0,223,197);
        repaint(); // redraw the panel by calling the paintComponent method.
    }

    @Override
    public void mousePressed(MouseEvent e) {
        int row, col; // the row and column in the grid of squares where the user clicked.
        row = findRow( e.getY() ); col = findColumn( e.getX() ); //find the location of cells clicked
        circleColor[row][col] = new Color(0);
        repaint(); // redraw the panel by calling the paintComponent method.
    }
        @Override public void mouseReleased(MouseEvent e) { }
        @Override public void mouseEntered(MouseEvent e) { }
        @Override public void mouseExited(MouseEvent e) { }
    }
    public static void main (String[] args) {
        new DD_GridFiller();
    }
}

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Ваша проблема заключалась в том, что mousePressed продолжал устанавливать цвет на черный. Даже если вы обнаружили, что при нажатии на кружок цвет не был черным, в mousePressed вы снова устанавливаете его на черный, а затем снова рисуется окружность, и вот так в цикле.

Решение довольно простое на самом деле:

  1. Удалить все в mousePressed. Нам это не нужно, mouseClicked - это уже просто mousePressed + mouseReleased.
  2. Добавьте это к вашему методу мыши.

    @Override
    public void mouseClicked(MouseEvent e) {
        int row, col; // the row and column in the grid of squares where the user clicked.
        row = findRow( e.getY() ); col = findColumn( e.getX() );  //find the location of cells clicked
    
        System.out.println("Cell color: " + circleColor[row][col]); //will let you see whats happening
        if (circleColor[row][col] == null) {
            circleColor[row][col] = new Color(0,223,197);
        } else {
            circleColor[row][col] = null;
        }
    
        repaint(); // redraw the panel by calling the paintComponent method.
    }
    

Что мы делаем - изначально все наши цвета равны нулю (раньше, в вашем коде, mousePressed установил их в RGB [0,0,0], т.е. в черный цвет). Поэтому, когда мы впервые щелкаем по ячейке и видим, что цвет ячейки «нулевой», то есть он пустой, мы устанавливаем цвет круга в наш новый цвет и рисуем круг. Если мы нажмем еще раз, мы обнаружим, что Цвет больше не является «нулевым», т. Е. Внутри ячейки есть кружок - тогда мы устанавливаем ячейку обратно в ноль.

Некоторым людям может не понравиться понятие «ноль» для Цвета - если вместо нуль вы хотите иметь RGB [0, 0, 0], просто преобразуйте любое начальное вхождение нуля в RGB [0, 0, 0 ], а затем используйте это:

public void mouseClicked(MouseEvent e) {
    ...

    //initial setup
    if (circleColor[row][col] == null) {
        circleColor[row][col] = new Color(0);
    }

    System.out.println("Cell color: " + circleColor[row][col]); //will let you see whats happening
    if (circleColor[row][col].equals(Color.getHSBColor(0,0,0))) {
        circleColor[row][col] = new Color(0,223,197);
    } else {
        circleColor[row][col] = new Color(0) ;
    }

    repaint(); // redraw the panel by calling the paintComponent method.
}
0 голосов
/ 17 марта 2019

Ваш метод paint проверяет положение строки / столбца для цвета; если он не нулевой, он рисует круг, верно? Возможно, в mousePressed вы можете проверить, является ли circleColor в этой позиции ненулевым, и, если это так, сделать его нулевым.

Мне не ясно, заполняет ли перекраска клетки; возможно, потребуется сделать это, чтобы переписать круг после того, как круг нарисован.

В таких приложениях обычно вычисляется минимальный прямоугольник, который требует перекраски, и только перерисовывается - вы делаете это, вычисляя этот прямоугольник и передавая его координаты в метод перекраски, затем рисуя только часть компонента (ов). ), которые пересекаются с измененным прямоугольником.

...