我的目的:通过继承JLabel类,模拟实现checkbox复选框,取代那丑陋的方框(用jlabel的icon代替);但是为了进一步美化,我想通过添加 鼠标监听事件 来实现 鼠标进入就能label就能改变方框的样式;
遇到问题:于是这里遇到了问题,我写的模拟复选框已经extends JLabel implements MouseListener了,但是我在其他地方调用这个类的时候,鼠标的动作对它没有影响,难道我封装的MouseListener一点用都没有了吗?请问我怎么修改才能实现我的目的呢?
(请最好不要提在调用它的类中添加监听的建议,因为要添加工程中很多这个东东实在太麻烦)
代码君卖萌中:
package Toolkits;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
public class myCheckbox extends JLabel implements MouseListener{
private boolean checked = false;
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
if(checked){
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox clicked.png")));
}else{
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox normal.png")));
}
this.checked = checked;
}
public myCheckbox() {
init();
}
public myCheckbox(String text) {
init();
setText(text);
}
private void init() {
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox normal.png")));
setText("Checkbox");
setSize(72, 18);
System.out.println("haha,I'm here!");
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(checked){
checked = false;
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox normal.png")));
}else{
checked = true;
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox clicked.png")));
}
updateUI();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox pressed.png")));
updateUI();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
if(checked){
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox clicked.png")));
}else{
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox normal.png")));
}
updateUI();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("enter!");
if(!checked){
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox entered.png")));
}
updateUI();
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("exit!");
if(!checked){
setIcon(new ImageIcon(myCheckbox.class.getResource("/Toolkits/checkbox normal.png")));
}
updateUI();
}
}
------解决方案--------------------
需要添加一句才行,下面是测试类,需要添加
b.addMouseListener(b);
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class myCheckboxTestClass {
public static void main(String[] args) {
JFrame frame = new JFrame();
Container container = frame.getContentPane();
myCheckbox b = new myCheckbox();
b.addMouseListener(b);
container.setSize(400,200);
frame.setSize(400,200);
container.add(b,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
------解决方案--------------------
其实你的这些问题都是新手很基础的问题,Java非常强大,对软件编写提供了足球场式的平台,比如Eclipse,Netbeans,Idea以及OpenOffice等著名软件都是用Java编写的。界面什么都可以“重绘”,比如可在运行时可插拔式的L&F就是很不错的, 可以在运行时完全不改变原有编程代码的同时,完全改变界面的外观(Look)和感觉(Feel),外观一般是指界面的布局(美化当然是在其中),感觉一般是指鼠标和键盘的响应时间以及音频触发等都可以一起打包随意切换。界面什么都可以“repaint”就说明完全可以以你自己想要的方式来绘制界面。另外,多线程与Swing相结合的例子可以实现界面动画效果。Preferences包可以储存软件参数设置,.properties文件或者ResourceBundle类可以切换国际语言等。Java都提供了十分方便的接口。具体可以参考http://bbs.csdn.net/topics/390836619?page=1内含源代码,相信你可以从中学到很多知识。