如何扩展Java SWT标签?

时间:2014-02-22 12:27:39

标签: java user-interface swt

我想扩展java SWT Label对象,发现它是不允许的。
所以我创建了一个包含Label对象的类'MyLabel' 它看起来像这样:

public class MyLabel {

    Label label;

    //more instance variables here...

    public MyLabel(Composite parent, int type) {
        label=new Label(parent,type);
        //more initialization here...
    }

    public void setText(String label_text) {
        label.setText(label_text);
    }

    public void setImage(Image label_image) {
        label.setImage(label_image);
    }

    public void addMouseListener(MouseListener board_listener) {
        label.addMouseListener(board_listener);
    }

    public void removeMouseListener(MouseListener board_listener) {
        label.removeMouseListener(board_listener);
    }

    //more staff here...
}

它运作良好一段时间,直到我开始听事件,并意识到这一点:

public class SWTTest {

    public static void main(String[] args) {

        Display display=new Display();
        Shell shell=new Shell(display);
        shell.setLayout(new RowLayout());


        MyLabel my_label=new MyLabel(shell, SWT.SHADOW_OUT);
        my_label.setText("this is my label");

        my_label.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseUp(MouseEvent e) {
                e.getSource(); //returns the Label object instead of MyLabel object...
            }

        });

        shell.pack();
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) 
                display.sleep();
        }
    }
}

这可能看起来不算太糟糕,但我有几个MyLabel对象,我需要知道MyLabel方面鼠标点击的来源。
这种情况有解决方案吗?

**编辑

我正在尝试创建自己的标签。更具体地说,我想要一个带有加法字段X的标签,以及一个getX()和setX(X x_var)。

** EDIT2

好的,我会更具体:
我有一个带有64个标签的棋盘,以8x8网格排序,每个都代表棋盘上的位置 现在,我想要实现的是,无论何时单击电路板上的64个位置中的一个 - 我会知道其中被点击,就x和y板而言 - 坐标即可。
所以,我想扩展Label,并向其添加Position实例变量。 (位置是一个包含x和y字段的类) 现在,只要单击其中一个标签,我就可以从“mouseUp(MouseEvent e)”方法中调用“getPoint()”方法,并知道单击该板上的哪个位置。

希望现在更加明确,并对这种含糊不清感到抱歉。

1 个答案:

答案 0 :(得分:3)

您可以使用setData Label方法保存对您班级的引用。

因此,当您创建标签时使用:

label.setData(myLabel);

在鼠标事件中你可以使用

MyLabel myLabel = (MyLabel)((Widget)e.getSource()).getData();