Java 从外部jpanel类中移动JFrame

Java 从外部jpanel类中移动JFrame,java,swing,Java,Swing,我试图通过外部jpanel类触发的事件在窗口上移动jframe,下面是我的代码,但没有实现这一点。取而代之的是正在移动的面板 我做错了什么?我一般是新编程的 package casuls_app; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Titlebar extends JPanel { public Titlebar() { btn

我试图通过外部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;
}
setLocation()设置JPanel的位置(因为您的类扩展了JPanel)。 如果有对JFrame的引用,则可以调用该对象上的setLocation方法

frame.setLocation(x, y);
如果没有引用,则可以按照以下步骤通过SwingUtilities访问帧:

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

这是stackoverflow,这很有效。