невозможно применить графику к оператору if - PullRequest
1 голос
/ 29 августа 2011

Я пишу программу с сеткой квадратов, которая при нажатии на нее меняет цвет с черного на красный. Я пишу оператор if для первого квадрата, и он не позволяет мне делать что-либо с графикой. Как мне 1) изменить цвет на красный, 2) нарисовать новый квадрат в том же месте и 3) почему это не похоже на объявление класса MouseHandler?

import java.awt.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class toggle extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.fillRect(0,0,20,20);
        g.fillRect(21,0,20,20);
        g.fillRect(42,0,20,20);
        g.fillRect(63,0,20,20);
        g.fillRect(84,0,20,20);
        g.fillRect(105,0,20,20);
        g.fillRect(126,0,20,20);
        g.fillRect(147,0,20,20);
        g.fillRect(168,0,20,20);
        g.fillRect(189,0,20,20);
        g.fillRect(190,0,20,20);
        //
        g.fillRect(0,21,20,20);
        g.fillRect(21,21,20,20);
        g.fillRect(42,21,20,20);
        g.fillRect(63,21,20,20);
        g.fillRect(84,21,20,20);
        g.fillRect(105,21,20,20);
        g.fillRect(126,21,20,20);
        g.fillRect(147,21,20,20);
        g.fillRect(168,21,20,20);
        g.fillRect(189,21,20,20);
        g.fillRect(190,21,20,20);
        //
        g.fillRect(0,42,20,20);
        g.fillRect(21,42,20,20);
        g.fillRect(42,42,20,20);
        g.fillRect(63,42,20,20);
        g.fillRect(84,42,20,20);
        g.fillRect(105,42,20,20);
        g.fillRect(126,42,20,20);
        g.fillRect(147,42,20,20);
        g.fillRect(168,42,20,20);
        g.fillRect(189,42,20,20);
        g.fillRect(190,42,20,20);
        //
        g.fillRect(0,63,20,20);
        g.fillRect(21,63,20,20);
        g.fillRect(42,63,20,20);
        g.fillRect(63,63,20,20);
        g.fillRect(84,63,20,20);
        g.fillRect(105,63,20,20);
        g.fillRect(126,63,20,20);
        g.fillRect(147,63,20,20);
        g.fillRect(168,63,20,20);
        g.fillRect(189,63,20,20);
        g.fillRect(190,63,20,20);
        //
        g.fillRect(0,84,20,20);
        g.fillRect(21,84,20,20);
        g.fillRect(42,84,20,20);
        g.fillRect(63,84,20,20);
        g.fillRect(84,84,20,20);
        g.fillRect(105,84,20,20);
        g.fillRect(126,84,20,20);
        g.fillRect(147,84,20,20);
        g.fillRect(168,84,20,20);
        g.fillRect(189,84,20,20);
        g.fillRect(190,84,20,20);
        //
        g.fillRect(0,105,20,20);
        g.fillRect(21,105,20,20);
        g.fillRect(42,105,20,20);
        g.fillRect(63,105,20,20);
        g.fillRect(84,105,20,20);
        g.fillRect(105,105,20,20);
        g.fillRect(126,105,20,20);
        g.fillRect(147,105,20,20);
        g.fillRect(168,105,20,20);
        g.fillRect(189,105,20,20);
        g.fillRect(190,105,20,20);
        //
        g.fillRect(0,126,20,20);
        g.fillRect(21,126,20,20);
        g.fillRect(42,126,20,20);
        g.fillRect(63,126,20,20);
        g.fillRect(84,126,20,20);
        g.fillRect(105,126,20,20);
        g.fillRect(126,126,20,20);
        g.fillRect(147,126,20,20);
        g.fillRect(168,126,20,20);
        g.fillRect(189,126,20,20);
        g.fillRect(190,126,20,20);
        //
        g.fillRect(0,147,20,20);
        g.fillRect(21,147,20,20);
        g.fillRect(42,147,20,20);
        g.fillRect(63,147,20,20);
        g.fillRect(84,147,20,20);
        g.fillRect(105,147,20,20);
        g.fillRect(126,147,20,20);
        g.fillRect(147,147,20,20);
        g.fillRect(168,147,20,20);
        g.fillRect(189,147,20,20);
        g.fillRect(190,147,20,20);
        //
        g.fillRect(0,168,20,20);
        g.fillRect(21,168,20,20);
        g.fillRect(42,168,20,20);
        g.fillRect(63,168,20,20);
        g.fillRect(84,168,20,20);
        g.fillRect(105,168,20,20);
        g.fillRect(126,168,20,20);
        g.fillRect(147,168,20,20);
        g.fillRect(168,168,20,20);
        g.fillRect(189,168,20,20);
        g.fillRect(190,168,20,20);
        //
        g.fillRect(0,189,20,20);
        g.fillRect(21,189,20,20);
        g.fillRect(42,189,20,20);
        g.fillRect(63,189,20,20);
        g.fillRect(84,189,20,20);
        g.fillRect(105,189,20,20);
        g.fillRect(126,189,20,20);
        g.fillRect(147,189,20,20);
        g.fillRect(168,189,20,20);
        g.fillRect(189,189,20,20);
        g.fillRect(190,189,20,20);
    }

    public toggle(){
        super();
        JFrame frame=new JFrame();
        frame.setTitle("toggle");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.setSize(226, 247);
        frame.setVisible(true);

        MouseHandler hand=new MouseHandler();
        addMouseListener(hand);

    }

    public class MouseHandler implements MouseListener{
        public void MousePressed (MouseEvent e){

            if(e.getX()<20&&e.getX()>0&&e.getY()<20&&e.getY()>0){


            }
        }
    }

    public static void main (String[]args){
        new toggle();
    }


}

Ответы [ 4 ]

2 голосов
/ 29 августа 2011

Также рассмотрим эту альтернативную реализацию с использованием JLabel и MouseAdapter.

1 голос
/ 29 августа 2011

3) почему оно не похоже на объявление класса MouseHandler?

При реализации интерфейса необходимо предоставить реализацию для всех методов или объявить реализацию abstract.В этом случае вы не реализовали ни одного метода - Java чувствителен к регистру, и MousePressed отличается от mousePressed, метода, который вы хотите реализовать.

Также выобнаружите, что есть несколько интерфейсов, которые имеют гораздо больше методов, чем вам интересно, и вы в конечном итоге предоставите пустые методы для удовлетворения компилятора.В таком случае вы можете посмотреть, есть ли класс «адаптера», который вы можете расширить.В этом случае вы найдете MouseAdapter полезным.

1 голос
/ 29 августа 2011

Конечно, вам не нужны все из них g.fillRect (0,0,20,20);Вы можете использовать цикл для обработки этого, так как в каждой строке есть шаблон для первого параметра.

1 голос
/ 29 августа 2011

1 и 2) Вам нужно сохранять состояние для каждого квадрата, например, в поле boolean[][], которое сообщит, нажата ли каждая клетка в вашей сетке или нет.В вашем методе paintComponent проверьте состояние каждого квадрата и вызовите g.setColor, передав в качестве аргумента Color.BLACK или Color.RED соответственно.

3) Вам необходимо реализовать все методы для MouseListener interface:

public class MouseHandler implements MouseListener {
    public void mousePressed( MouseEvent e ) {
        // your logic here
    }

    public void mouseReleased( MouseEvent e ) {
        // leave method empty, since you don't need to listen to this event
    }

    // Same as above for mouseClicked, mouseEntered, mouseExited
}

или расширить класс MouseAdapter и переопределить mousePressed, если вам не нужны другие MouseListener события:

public class MouseHandler extends MouseAdapter {
    public void mousePressed( MouseEvent e ) {
        // your logic here
    }

    // No need to override the other methods, since
    // MouseAdapter already has empty implementations for them
}

Кроме того,правильное имя для реализуемого вами метода - mousePressed (обратите внимание на строчную букву m).

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