简体   繁体   中英

mouse Clicked event change colors

Well the goal of this program is to create a bullseye; and when you click on the panel, it will change the color of the bullseye from red to blue. When you click on mine nothing happens. What is causing this?

import java.awt.*;

public class TargetLogoPanel extends javax.swing.JPanel {

public Color ringColor = Color.RED;
public int size = 400;
public TargetLogoPanel() {

    setBackground(Color.WHITE);
    setPreferredSize(new Dimension(700,400 ));
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int width = getWidth();
        int height = getHeight();

       int radius = getHeight();

     g.setColor(ringColor);
        g.fillOval(
                (int)((width/2 ) - (radius * 0.3)),
                (int)((height/2) - (radius * 0.3)), 
                (int)(radius * .6), 
                (int)(radius * .6));
        g.setColor(Color.WHITE);
        g.fillOval(
                (int)((width / 2) - (radius * 0.22)),
                (int)((height / 2) - (radius * 0.22)), 
                (int)(radius * 0.44), 
                (int)(radius * 0.44));
        g.setColor(ringColor);
        g.fillOval(
                (int)((width / 2) - (radius * 0.15)),
                (int)((height / 2) - (radius * 0.15)), 
                (int)(radius * 0.3), 
                (int)(radius * 0.3));
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            formMouseClicked(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );
}// </editor-fold>                        

private void formMouseClicked(java.awt.event.MouseEvent evt) {                                  
   if(ringColor == Color.RED){
       ringColor = Color.BLUE;
       repaint();
   } else{
       ringColor = Color.RED;
       repaint();
   }
}                                 


// Variables declaration - do not modify                     
// End of variables declaration                   
}

Invoke initComponents() in your panel's constructor.

public TargetLogoPanel() {
    initComponents();
    setBackground(Color.WHITE);
    setPreferredSize(new Dimension(700, 400));
}

As tested:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.JFrame;

/**
 * @see http://stackoverflow.com/a/22548923/230513
 */
public class Test {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TargetLogoPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    class TargetLogoPanel extends javax.swing.JPanel {

        public Color ringColor = Color.RED;
        public int size = 400;

        public TargetLogoPanel() {
            initComponents();
            setBackground(Color.WHITE);
            setPreferredSize(new Dimension(700, 400));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            int width = getWidth();
            int height = getHeight();
            int radius = getHeight();
            g.setColor(ringColor);
            g.fillOval(
                (int) ((width / 2) - (radius * 0.3)),
                (int) ((height / 2) - (radius * 0.3)),
                (int) (radius * .6),
                (int) (radius * .6));
            g.setColor(Color.WHITE);
            g.fillOval(
                (int) ((width / 2) - (radius * 0.22)),
                (int) ((height / 2) - (radius * 0.22)),
                (int) (radius * 0.44),
                (int) (radius * 0.44));
            g.setColor(ringColor);
            g.fillOval(
                (int) ((width / 2) - (radius * 0.15)),
                (int) ((height / 2) - (radius * 0.15)),
                (int) (radius * 0.3),
                (int) (radius * 0.3));
        }

        /**
         * This method is called from within the constructor to initialize the
         * form. WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {

            addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    formMouseClicked(evt);
                }
            });

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 400, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGap(0, 300, Short.MAX_VALUE)
            );
        }// </editor-fold>                        

        private void formMouseClicked(java.awt.event.MouseEvent evt) {
            if (ringColor == Color.RED) {
                ringColor = Color.BLUE;
                repaint();
            } else {
                ringColor = Color.RED;
                repaint();
            }
        }

// Variables declaration - do not modify                     
// End of variables declaration                   
    }

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

            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}

Essentially, you haven't registered a MouseListener to respond to mouse events.

The initComponents method that the Netbeans form editor created was used to register a MouseListener , but you stopped calling it.

Try calling initComponents within you component's constructor...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM