效果
题目
*16.7(使用鼠标设置背景色)编写一个程序,显示一个面板的颜色,当按下鼠标键时背景为黑色,释放鼠标时背景为白色
代码
package Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Exercise16_7 extends JFrame {
public Exercise16_7(){
ChangeMessage cm=new ChangeMessage();
add(cm);
}
public static void main(String[] args) {
Exercise16_7 frame=new Exercise16_6();
frame.setTitle("鼠标按下显示黑色,释放显示白色");
frame.setSize(400,200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
static class ChangeMessage extends JPanel{
private String message1="java is fun";
private String message2="java is powerful";
private static int i=0;
public ChangeMessage(){
addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
i++;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
i++;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
protected void paintComponent(Graphics g) {
super.paintComponents(g);
if(i%2==0){
g.setColor(Color.white);
g.fillRect(0,0,getWidth(),getHeight());
}
else{
g.setColor(Color.black);
g.fillRect(0,0,getWidth(),getHeight());
}
}
}
}
思路解析
这里用到了鼠标监听器——addMouseListener
值得一提的是,因为监听器只关心鼠标的操作,所以采用的是匿名内部类监听器扩展MouseListener,而MouseListener是需要实现所有的处理器的,即使监听器并不关心其他时间,也必须重写所有处理器。
public ChangeMessage(){
addMouseListener(new MouseListener() {
//即使监听器并不关心其他时间,也必须重写所有处理器。
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
i++;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
i++;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
MouseMotionListener接口和MouseListener接口所覆盖的方法
MouseMotionListener | MouseListener |
---|---|
鼠标拖动 | 鼠标按下 |
鼠标移动 | 鼠标释放 |
鼠标点击 | |
鼠标输入 | |
鼠标退出 |
因为题目里面要求的是鼠标按下和释放,所以选择扩展MouseListener类
在鼠标点击方法、释放——mousePressed、mouseRelease里面添加内容,每次点击使得静态变量i自增一次,然后调用repaint()方法。
repaint()方法会让JVM调用paintComponent方法
paintComponent方法的实现
protected void paintComponent(Graphics g) {
super.paintComponents(g);
if(i%2==0){
g.setColor(Color.white);
g.fillRect(0,0,getWidth(),getHeight());
}
else{
g.setColor(Color.black);
g.fillRect(0,0,getWidth(),getHeight());
}
}
因为paintComponent方法写在内部类里面,所以是共享私有成员变量的,每次点击,i自增,paintComponent方法利用取余的方式。
这里用矩形填充了整个页面,所以看起来好像背景颜色被改变。
因为希望在屏幕上绘制字符串,所以内部类继承了JPanel
static class ChangeMessage extends JPanel{}.....
完成以上工作后,在主类里面对这个内部类进行实例化,增加到frame里面即可。