У меня возникли проблемы с перерисовкой круга (овала) в квадрате обратно в исходный цвет фона / переднего плана, когда пользователь щелкает мышью - PullRequest
0 голосов
/ 21 октября 2018

Моя программа должна заполнять круг (овал) в сетке меток 4x4, когда пользователь нажимает на определенный квадрат, и снимать закрашивание (удалять закрашенный круг), если щелкает тот же квадрат.Кроме того, предыдущий квадрат, который был нарисован, должен оставаться до тех пор, пока на этот квадрат снова не нажмут.У меня проблемы с удалением заполненного круга.Я очень плохо знаком с графикой и рисованием компонентов, и мне трудно понять, почему это не удалит круг.Я удалил свой проблемный код, потому что я не знал, что я делаю неправильно.Я знаю, что должен перекрасить квадрат в исходный фон, но я не могу заставить его работать.Поэтому я публикую свой код там, где он заполняет круг при щелчке мышью.Буду признателен за ваш отзыв.

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.border.Border;
/**
 * 
 *
 * This GUI application displays 4 x 4 squares. When the user clicks on a square,
 * a circle appears in the square and disappear when the user clicks the square again.
 */
public class DY_FillingTheGrid_2 extends JFrame {

    JFrame frame = new JFrame();
    JPanel gridPanel = new JPanel();                        // Create panel
    JLabel[] gridLabel = new JLabel[17];
    JLabel locatedLabel = new JLabel();

/*
 * Constructor
 */
public DY_FillingTheGrid_2() {

    setTitle("Filling The Grid");                       // Create title 
    setPreferredSize( new Dimension( 480, 500 ) );      // Set size of the frame
    setDefaultCloseOperation(EXIT_ON_CLOSE);            // Set exit operation on close button
    setLayout(new BorderLayout());                      // Create BorderLayout

    buildGrid();                                        // Call method to build grid

    add(gridPanel, BorderLayout.CENTER);                // Add panel to frame and set BorderLayout
    pack();
    setVisible(true);
}

/**
 * Paint method
 */
public void paint(Graphics g) {

    double width = locatedLabel.getSize().getWidth();   // Initialize width to the size of label
    double height = locatedLabel.getSize().getHeight(); // Initialize height to the size of label

    super.paint(g);                                     // Call super class paint method

    // Paint the circle
    g.fillOval(locatedLabel.getX()+8, locatedLabel.getY()+30, (int) width, (int) height);
} 

/**
 * Private inner class MyMouseListener that responds to the event of the mouse
 */
private class MyMouseListener extends MouseAdapter {
    @Override
    public void mouseClicked(MouseEvent e){

        locatedLabel = (JLabel)e.getSource();   

        if (locatedLabel.getForeground().equals(Color.BLACK)) {
            repaint(locatedLabel.getX()+8, locatedLabel.getY()+30, (int)locatedLabel.getSize().getWidth(), (int)locatedLabel.getSize().getHeight());

        }
        else {
            locatedLabel.setForeground(Color.WHITE);
            repaint(locatedLabel.getX()+8, locatedLabel.getY()+30, (int)locatedLabel.getSize().getWidth(), (int)locatedLabel.getSize().getHeight());
        }

   }
}

/**
 * The buildGrid method builds 4 x 4 grid with labels and panel as a container
 */
private void buildGrid() {

    Border border = BorderFactory.createLineBorder(Color.BLUE, 1);          // Set grid line color

    gridPanel = new JPanel();                                               // Create Panel
    gridPanel.setLayout(new GridLayout(4,4));                               // Set to GridLayout 4 x 4

    // Create 16 labels for each grid
    for (int i=1; i < gridLabel.length; i++) {
        gridLabel[i] = new JLabel();
        gridLabel[i].setBorder(border);
        gridPanel.add(gridLabel[i]);
        gridLabel[i].addMouseListener(new MyMouseListener());
    }
}

/**
 *  Main method
 * @param args
 */
public static void main(String[] args) {

    DY_FillingTheGrid_2 fg = new DY_FillingTheGrid_2();
}
}
...