将JButton设置移动到单独的类

时间:2014-11-19 17:03:00

标签: java swing jbutton encapsulation

我有一个创建一系列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) {}
        });
    }   
}

这一切都可以毫无错误地编译,无论价值多少。按钮布局在适当的大小和适当的位置。但是,图像不会出现(按钮为空白),鼠标监听器不起作用。任何人都可以看到我做错了什么以及如何使这项工作?

2 个答案:

答案 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) {}
        });
    }
}