【问题标题】:Move JFrame from external jpanel class从外部 jpanel 类中移动 JFrame
【发布时间】:2021-02-16 19:43:12
【问题描述】:

我试图通过从外部 jpanel 类触发的事件在窗口上移动 jframe,我的代码在下面,但没有实现这一点。相反,面板是移动的。

我在这里做错了什么?总的来说,我是编程新手。

package casuls_app;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Titlebar extends JPanel  {
    public Titlebar() {
        
        btnClose =new JButton("X");
        btnClose.setFocusable(false);
        btnClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                closeButtonPressed(e);
                }
            }
        );
        
        controlBox =new JPanel(new GridLayout(1,1));
        controlBox.setPreferredSize(new Dimension(150,40));

        controlBox.add(btnClose);
        controlBox.setBackground(new Color(255,255,255));
        
        setLayout(new BorderLayout());
        add(controlBox,BorderLayout.EAST);
        setPreferredSize(new Dimension(0,40));
        setBackground(new Color(60, 173, 205));
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                mousePressedOnTitlebar(e);
            }
        }
        );
        
        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                mouseDraggedOnTitlebar(e);
            }
        }
        );
    }
    
    private void mousePressedOnTitlebar(MouseEvent e) {
        posX= e.getX();
        posY=e.getY();
    }
    
    private void mouseDraggedOnTitlebar(MouseEvent e) {
        setLocation(e.getXOnScreen() -posX, e.getYOnScreen() -posY);
    }
    
    private void closeButtonPressed(ActionEvent e){
        System.exit(0);
    }
    
    
    //Variables declaration
    private int posX,posY;
    private JButton btnClose;
    private JPanel controlBox;
}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    setLocation() 设置 JPanel 的位置(因为您的类扩展了 JPanel)。 如果您有对 JFrame 的引用,则可以在该对象上调用 setLocation 方法。

    frame.setLocation(x, y);
    

    如果您没有参考,那么您可以关注this post,它通过 SwingUtilities 访问框架:

    JFrame topFrame = (JFrame) SwingUtilities.getWindowAncestor(this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多