我在Java中构建UI。我想使用按钮创建新组件,如JLabel。因此,每次单击按钮时,它都会创建一个新的JLabel并将它们放在特定的JPanel中。
然后,我希望能够根据用户点击标签的方式对标签做一些事情。
按住鼠标左键,我希望他们可以在屏幕上拖动标签。
点击鼠标右键,我想打开一个新窗口,输入某些数据,绑定到标签(可能涉及动态创建变量)。
我一直在玩一些我用Google搜索过的代码。我可以在面板中创建一个按钮来创建新标签,但是当我试图让它们拖动时,我一次只能看到一个标签出现,按下第二个按钮后,移动标签不是顺利,它跳来跳去。
我还没有试过实现任何鼠标右击。如果有人能指出我正确的方向,我会很感激。
to_numeric
编辑 - 我相当肯定主要问题在于如何将JLabel本身添加到面板中。每次按下按钮时,它都会再次添加相同的标签,这会使作品变得粗糙。
不幸的是,我不确定如何处理。我已经做了一些挖掘,因为动态变量是不可能的,我将不得不使用数组或地图或某种类型。有了它,似乎我可以声明组件数组。这样的事情对我来说是否必要?
答案 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);
}
}