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