Java:向动态创建的组件添加事件

时间:2017-11-17 03:09:30

标签: java events dynamic draggable

我在Java中构建UI。我想使用按钮创建新组件,如JLabel。因此,每次单击按钮时,它都会创建一个新的JLabel并将它们放在特定的JPanel中。

然后,我希望能够根据用户点击标签的方式对标签做一些事情。

按住鼠标左键,我希望他们可以在屏幕上拖动标签。

点击鼠标右键,我想打开一个新窗口,输入某些数据,绑定到标签(可能涉及动态创建变量)。

我一直在玩一些我用Google搜索过的代码。我可以在面板中创建一个按钮来创建新标签,但是当我试图让它们拖动时,我一次只能看到一个标签出现,按下第二个按钮后,移动标签不是顺利,它跳来跳去。

我还没有试过实现任何鼠标右击。如果有人能指出我正确的方向,我会很感激。

to_numeric

编辑 - 我相当肯定主要问题在于如何将JLabel本身添加到面板中。每次按下按钮时,它都会再次添加相同的标签,这会使作品变得粗糙。

不幸的是,我不确定如何处理。我已经做了一些挖掘,因为动态变量是不可能的,我将不得不使用数组或地图或某种类型。有了它,似乎我可以声明组件数组。这样的事情对我来说是否必要?

1 个答案:

答案 0 :(得分:0)

您的代码中真的很奇怪。我不想做任何事情,而且我不是想象中的专家,但我试图去除多余或矛盾的东西。我怀疑你所做的一部分只是复制粘贴位而没有真正使它们适合代码。

无论如何,您需要在侦听器中创建标签,以便每次单击时都会创建一个新标签。否则,您只需创建一个标签,并且每次都重复使用它。

我实施了右键单击对话框以输入标签名称,不知道您想要做什么,但至少它会检测到正确的点击次数。

通常,它更容易使用布局管理器而不是硬编码所有内容。在这里你有一个borderlayout但忽略了它。

class Main {

    //Launch the application.
    public static void main(String[] args) {
        DrageableLabel window = new DrageableLabel();
    }
}

public class DrageableLabel {

    public DrageableLabel() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        JFrame frame = new JFrame();
        Container area = frame.getContentPane();
        area.setLayout(new BorderLayout());

        JButton btnCreate = new JButton("Create Label");
        btnCreate.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (SwingUtilities.isRightMouseButton(e)) {
                    /* 
                    This is where you create your new window
                    for now I've added a dialog that takes a string parameter and creates a label with that string
                    I moved the method code to create a new drageable label outside the actionlistener to make it less confusing and reuseable
                    Either build w-e you want directly in here
                    or call a method that does it (which I prefer)
                     */
                    String string = JOptionPane.showInputDialog(frame, "Enter your message", "Messages", JOptionPane.CANCEL_OPTION);
                    addDrageableLabel(string, area);
                } else if (SwingUtilities.isLeftMouseButton(e)) {
                    addDrageableLabel("Drag me", area);
                }
            }
        });
        area.add(btnCreate, BorderLayout.SOUTH);

        frame.setBounds(100, 100, 511, 542);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    // This is the method that creates and adds a drageable label
    public void addDrageableLabel(String labelName, Container container) {
        JLabel dragLabel = new JLabel(labelName);
        container.add(dragLabel, BorderLayout.CENTER);
        container.validate();

        DragListener drag = new DragListener();
        dragLabel.addMouseListener(drag);
        dragLabel.addMouseMotionListener(drag);
    }
}

class DragListener extends MouseInputAdapter {

    Point location;
    MouseEvent pressed;

    @Override
    public void mousePressed(MouseEvent me) {
        pressed = me;
    }

    @Override
    public void mouseDragged(MouseEvent me) {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        component.setLocation(x, y);
    }
}