jframejava上的Move按钮

jframejava上的Move按钮,java,button,jframe,mouselistener,Java,Button,Jframe,Mouselistener,我有一项任务要申请,它将执行以下操作: 如果我移动鼠标,坐标应该显示在状态栏上 如果单击鼠标,则JPanel上的唯一一个按钮应移动到单击坐标 所以问题是,当我用鼠标点击的时候——这很好,按钮移动到点击的坐标,但是当我开始移动鼠标的时候,按钮又回到了原来的位置 public class Window extends JFrame { private JLabel statusBar; private JPanel mainPanel, statusBarPanel; JBu

我有一项任务要申请,它将执行以下操作: 如果我移动鼠标,坐标应该显示在状态栏上 如果单击鼠标,则JPanel上的唯一一个按钮应移动到单击坐标 所以问题是,当我用鼠标点击的时候——这很好,按钮移动到点击的坐标,但是当我开始移动鼠标的时候,按钮又回到了原来的位置

public class Window extends JFrame {
    private JLabel statusBar;
    private JPanel mainPanel, statusBarPanel;
    JButton button;
    public Window()
    {
        super("Window");
        setSize(400,600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel=new JPanel();
        statusBarPanel = new JPanel();
        statusBar=new JLabel("Coords: ");
        add(statusBarPanel, BorderLayout.SOUTH);
        add(mainPanel,BorderLayout.CENTER);
        mainPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
        statusBarPanel.add(statusBar,BorderLayout.CENTER);
        button = new JButton("Default text");
        mainPanel.add(button);
        MyMouseListener myMouseListener=new MyMouseListener();
        mainPanel.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                super.mouseMoved(e);
                statusBar.setText("Coords: ("+e.getX()+":"+e.getY()+")");
            }
        });
        mainPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                button.setLocation(e.getX()-button.getWidth()/2,e.getY()-button.getHeight()/2);
            }
        });
        mainPanel.setFocusable(true);
        setVisible(true);
    }
}

这是极少数不希望面板具有布局管理器的情况之一,因为您需要绝对定位

JPanel
有一个默认的布局管理器,它是一个
FlowLayout
,您对
setLocation
的调用只会产生临时效果,直到面板重新验证其内容并将内容放置在最初应该放置的位置

请参见下面的示例和注释,它应该可以为您提供总体思路:

public class Window extends JFrame {
    private final JLabel statusBar;
    private final JPanel mainPanel, statusBarPanel;
    JButton button;

    public Window() {
        super("Window");
        setSize(400, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainPanel = new JPanel();
        mainPanel.setLayout(null);// no layout for absolute positioning
        statusBarPanel = new JPanel();
        statusBar = new JLabel("Coords: ");
        add(statusBarPanel, BorderLayout.SOUTH);
        add(mainPanel, BorderLayout.CENTER);
        mainPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
        statusBarPanel.add(statusBar, BorderLayout.CENTER);
        button = new JButton("Default text");

        // place the button "manually"
        button.setBounds((int) (400 - button.getPreferredSize().getWidth()) / 2, 0,
                (int) button.getPreferredSize().getWidth(),
                (int) button.getPreferredSize().getHeight());
        mainPanel.add(button);

        mainPanel.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(final MouseEvent e) {
                super.mouseMoved(e);
                statusBar.setText("Coords: (" + e.getX() + ":" + e.getY() + ")");
            }
        });
        mainPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(final MouseEvent e) {
                super.mouseClicked(e);
                button.setLocation((int) (e.getX() - button.getPreferredSize().getWidth() / 2),
                        (int) (e.getY() - button.getPreferredSize().getHeight() / 2));


            }
        });
        mainPanel.setFocusable(true);
        setVisible(true);
    }

}

注意到我忘记删除MyMouseListener MyMouseListener=new MyMouseListener();所以,不管怎样,这对我帮助很大:)我想了一些类似的事情,但我的朋友们做得和我一样好,他们没有遇到这样的问题,所以我很困惑)也许我们的代码不像我想的那么相似