在Jframe Java上移动按钮



我有一项任务要执行以下操作:

  • 如果我移动鼠标,则应在状态栏上显示坐标
  • 如果单击鼠标,则在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);
    }
}

最新更新