我有一个创建一系列JButton的循环。这段代码深埋在一个主要关注多线程的类中,因此它使用Executors,Callables,Futures等。我试图保持这个类相当封装,所以我想移动设置的工作把JButton打造成自己的类。这是我的循环体,它创建一个按钮。它运作得很好:
JButton imageButton = new JButton(new ImageIcon(image));
imageButton.setMinimumSize(imageSize);
imageButton.setPreferredSize(imageSize);
imageButton.setMaximumSize(imageSize);
imageButton.setVisible(true);
imageButton.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
// do a bunch of stuff }
}
@Override
public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {}
});
imagesPanel.add(imageButton);
这只会变得更加混乱,所以这是我尝试将它移到一个单独的类:
ImageButton imageButton = new ImageButton(image, imageSize);
imageButton.addMouseMotionListener();
imagesPanel.add(imageButton);
这是我的班级:
public class ImageButton extends JButton {
JButton button;
static final long serialVersionUID = 1;
public ImageButton(Image image, Dimension imageSize) {
button = new JButton(new ImageIcon(image));
button.setMinimumSize(imageSize);
button.setPreferredSize(imageSize);
button.setMaximumSize(imageSize);
button.setVisible(true);
}
public void addMouseMotionListener() {
button.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
// do a bunch of stuff
}
@Override
public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {}
});
}
}
这一切都可以毫无错误地编译,无论价值多少。按钮布局在适当的大小和适当的位置。但是,图像不会出现(按钮为空白),鼠标监听器不起作用。任何人都可以看到我做错了什么以及如何使这项工作?
答案 0 :(得分:1)
您的ImageButton
课程错了。你在里面持有一个不必要的JButton实例。
因此,实施应该是:
public class ImageButton extends JButton {
static final long serialVersionUID = 1;
public ImageButton(Image image, Dimension imageSize) {
super(new ImageIcon(image));
this.setMinimumSize(imageSize);
this.setPreferredSize(imageSize);
this.setMaximumSize(imageSize);
this.setVisible(true);
}
public void addMouseMotionListener() {
this.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
// do a bunch of stuff
}
@Override
public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {}
});
}
}
这样,您将参数设置为类而不是成员,ImageButton
的所有实例都将具有相同的配置。
答案 1 :(得分:0)
扩展JButton并在类中创建另一个JButton。 可能你想做这样的事情:
public static class ImageButton extends JButton {
JButton button; // Remove me
static final long serialVersionUID = 1;
public ImageButton(Image image, Dimension imageSize) {
super(new ImageIcon(image));
setMinimumSize(imageSize);
setPreferredSize(imageSize);
setMaximumSize(imageSize);
setVisible(true);
// Dont see why there should be separate method for the addMouseMotionListeners
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(java.awt.event.MouseEvent mouseEvent) {
// do a bunch of stuff
}
@Override
public void mouseMoved(java.awt.event.MouseEvent mouseEvent) {}
});
}
}