鼠标单击事件更改颜色

时间:2014-03-21 02:03:39

标签: java swing event-handling mouse mouseclick-event

这个计划的目标是创造一个靶心;当你点击面板时,它会将靶心的颜色从红色变为蓝色。当你点击我的时候没有任何反应。造成这种情况的原因是什么?

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                   
}

2 个答案:

答案 0 :(得分:3)

在面板的构造函数中调用initComponents()

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

经测试:

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();
            }
        });
    }
}

答案 1 :(得分:3)

基本上,您尚未注册MouseListener来响应鼠标事件。

Netbeans表单编辑器创建的initComponents方法用于注册MouseListener,但您已停止调用它。

尝试在您组件的构造函数中调用initComponents ...