java - 使 JPanel 可拖动

标签 java swing user-interface

我在 Mac 上使用 JPanel 扩展了工具栏(参见图片),但实际工具栏部分(不是 JPanel)是唯一可以单击和拖动的部分。我如何允许用户单击并拖动 JPanel 来移动窗口,就像他们移动工具栏一样

图像顶部大约毫米是实际的工具栏(带有文本),其余部分是 JPanel(带有按钮)。 enter image description here

下面是 UnifiedToolPanel 的代码,它设置在 JFrame 中边框布局的北边:

package gui;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;

import com.jgoodies.forms.factories.Borders;

public class UnifiedToolbarPanel extends JPanel implements WindowFocusListener {

    public static final Color OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR =
            new Color(64, 64, 64);
    public static final Color OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR =
            new Color(135, 135, 135);    

    public static final Color OS_X_TOP_FOCUSED_GRADIENT = new Color(214+8, 214+8, 214+8);
    public static final Color OS_X_BOTTOM_FOCUSED_GRADIENT = new Color(217, 217, 217);
    public static final Color OS_X_TOP_UNFOCUSED_GRADIENT = new Color(240+3, 240+3, 240+3);
    public static final Color OS_X_BOTTOM_UNFOCUSED_GRADIENT = new Color(219, 219, 219);


    public UnifiedToolbarPanel() {
        // make the component transparent
        setOpaque(true);
        Window window = SwingUtilities.getWindowAncestor(this);
        // create an empty border around the panel
        // note the border below is created using JGoodies Forms
        setBorder(Borders.createEmptyBorder("3dlu, 3dlu, 1dlu, 3dlu"));
    }


    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Window window = SwingUtilities.getWindowAncestor(this);
        Color color1  = window.isFocused() ? OS_X_TOP_FOCUSED_GRADIENT
                : OS_X_TOP_UNFOCUSED_GRADIENT;
        Color color2 = window.isFocused() ? color1.darker()
                : OS_X_BOTTOM_UNFOCUSED_GRADIENT;
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(
            0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

    @Override
    public Border getBorder() {
        Window window = SwingUtilities.getWindowAncestor(this);
        return window != null && window.isFocused()
                ? BorderFactory.createMatteBorder(0,0,1,0,
                        OS_X_UNIFIED_TOOLBAR_FOCUSED_BOTTOM_COLOR)
                : BorderFactory.createMatteBorder(0,0,1,0,
                       OS_X_UNIFIED_TOOLBAR_UNFOCUSED_BORDER_COLOR);
    }


    @Override
    public void windowGainedFocus(WindowEvent e) {
        repaint();
    }


    @Override
    public void windowLostFocus(WindowEvent e) {
        repaint();
    }
}

最佳答案

如何允许用户单击并拖动 JPanel 来移动窗口
这是方法:

   private int x;
    private int y;
    //.....
    //On mouse pressed:
    jpanel.addMouseListener(new MouseAdapter(){
       public void mousePressed(MouseEvent ev){
        x = ev.getX ();
        y = ev.getY();
       }
    });
    //....
    //on mouse dragged
    jpanel.addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseDragged(MouseEvent evt) {
                    int x = evt.getXOnScreen()-this.x;
                    int y = evt.getYOnScreen -this.y;
                    this.setLocation(x,y); 

                }
            });

this.setLocation(x,y) 将移动 Frame 而不是 panel,我认为你的类扩展了 JFrame
但是,您可以创建一个返回点 (x,y) 的方法并将其设置到窗口

关于java - 使 JPanel 可拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16738770/

相关文章:

java - 如何在android中获取准确的UTC时间戳

java - java 服务器的无响应 GUI

java - 让两个JList同时滚动

java - 将 SOP 控制台消息重定向到 JTextArea 并且也不应该闪烁并且应该与 java 控制台相同逐行打印

java - 填充 JTextField 时丢失 "next line"格式

java - 如果 Spring 配置文件与指定的配置文件不同,如何使用注释 @Profile 跳过服务类

java - 从 Java 输入流中读取下一个字符(完整的 unicode 代码点)

java - 在 java swing onclick 中的 onclick 事件期间显示加载动画

ios - 不同屏幕尺寸的用户界面图像大小?

java - JList 在自动滚动和自动选择时变坏(GUI 问题)