swing实现窗体拖拽和拉伸

2023-11-09

当用setUndecorated(true) 后 JFrame去掉标题栏后就得自己写拖拽和拉伸功能了。

下面是效果图,我的截图软件不能够截取除系统默认光标外的光标,所以各个方向光标变化在图中没有体现


代码如下:

import javax.swing.*;
import java.awt.*;

/**
 * 窗体拖拽和拉伸
 */
public class winReSizeDemo {
    private JFrame jf;
    public winReSizeDemo(){
        jf=new JFrame();
        jf.setUndecorated(true);//去标边界和标题栏
        jf.setLocationRelativeTo(null);//窗口置中
        jf.setSize(400,400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        reSizeEvent dg = new reSizeEvent(jf);
        /**添加两个监听器**/
        jf.addMouseListener(dg);
        jf.addMouseMotionListener(dg);
        jf.setVisible(true);
    }
    public static void main(String [] args){
        new winReSizeDemo();
    }
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
 * 实现窗口各个方向拉伸以及拖动。
 */
public class reSizeEvent extends MouseAdapter{
    public JFrame jf;
    private Point prePos,curPos,jfPos;
    private static final double BREADTH = 15.0;//边界拉伸范围
    private  int dragType;
    private static final int DRAG_MOVE = 1;
    private static final int DRAG_UP = 2;
    private static final int DRAG_UPLEFT = 3;
    private static final int DRAG_UPRIGHT = 4;
    private static final int DRAG_LEFT = 5;
    private static final int DRAG_RIGHT = 6;
    private static final int DRAG_BOTTOM = 7;
    private static final int DRAG_BOTTOMLEFT = 8;
    private static final int DRAG_BOTTOMRIGHT = 9;
    public reSizeEvent(JFrame jf){
        this.jf = jf;
    }
    @Override
    public void mousePressed(MouseEvent e){
        prePos = e.getLocationOnScreen();
    }
    @Override
    public void mouseMoved(MouseEvent e){
        areaCheck(e.getPoint());
    }
    @Override
    public void mouseDragged(MouseEvent e){
        curPos = e.getLocationOnScreen();
        jfPos = jf.getLocation();
        dragAction();
        prePos = curPos;
    }
    private void dragAction(){
        switch(dragType){
            case DRAG_MOVE:
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y+curPos.y-prePos.y);
                break;
            case DRAG_UP://x位置不变,y位置变化,并且Height变化
                jf.setLocation(jfPos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth(), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_LEFT://y位置不变,x位置变化,width变化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight());
                break;
            case DRAG_RIGHT://x,y位置不变,width变化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight());
                break;
            case DRAG_BOTTOM://x,y位置不变,Height变化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth(), jf.getHeight()+(curPos.y-prePos.y));
                break;
            case DRAG_UPLEFT://x,y位置均变化,h,w均变化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_BOTTOMRIGHT://x,y位置均不变,h,w变化
                jf.setLocation(jfPos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
                break;
            case DRAG_UPRIGHT://x位置不变,y,w,h变化
                jf.setLocation(jfPos.x,
                        jfPos.y+curPos.y-prePos.y);
                jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
                break;
            case DRAG_BOTTOMLEFT://y不变,xwh变化
                jf.setLocation(jfPos.x+curPos.x-prePos.x,
                        jfPos.y);
                jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
                break;
            default:
                break;
        }
    }
    private boolean areaCheck(Point p){
        if(p.getX()<=BREADTH && p.getY()<=BREADTH){
            dragType = DRAG_UPLEFT;
            jf.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));
        }else if(p.getX()>BREADTH
                && p.getX()<(jf.getWidth()-BREADTH)
                && p.getY()<=BREADTH){
            dragType = DRAG_UP;
            jf.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH) && p.getY()<=BREADTH){
            dragType = DRAG_UPRIGHT;
            jf.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR));
        }else if(p.getX()<=BREADTH
                && p.getY()<(jf.getHeight()-BREADTH)
                && p.getY()>BREADTH){
            dragType = DRAG_LEFT;
            jf.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH)
                && p.getY()<(jf.getHeight()-BREADTH)
                && p.getY()>BREADTH){
            dragType = DRAG_RIGHT;
            jf.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
        }else if(p.getX()<=BREADTH
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOMLEFT;
            jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR));
        }else if(p.getX()>BREADTH
                && p.getX()<(jf.getWidth()-BREADTH)
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOM;
            jf.setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
        }else if(p.getX()>=(jf.getWidth()-BREADTH)
                && p.getY()>=(jf.getHeight()-BREADTH)){
            dragType = DRAG_BOTTOMRIGHT;
            jf.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
        }else{
            dragType = DRAG_MOVE;
            jf.setCursor(new Cursor(Cursor.MOVE_CURSOR));
            return false;
        }
        return true;
    }
}






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

swing实现窗体拖拽和拉伸 的相关文章

  • JFreeChart MeterPlot

    我目前正在用java做Agent项目 在某些时候 我需要显示一个仪表 例如 电池电量 我的程序中有 5 个代理 每个代理都会创建自己的带有名称的仪表图 但不知何故他们没有更新数据集 或者他们正在更新数据集 只是它没有显示在仪表图上 任何想法
  • 在 JButton 上显示 Unicode 字符

    我正在尝试显示这个 Unicode uD83D on a JButton文本 但当我编译时 它只显示未知字符的平方 托马斯给出了一个很好的答案 但请注意 为了避免猜测哪些已安装的字体支持字符或字符串 我们可以迭代可用的字体并使用canDis
  • 基本的 Swing 库? JGoodies,JFreeChart [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java swing:为 JComboBox 实现我的 Combobox 模型

    我需要我的组合框包含组织的简称 问题是我can在下拉列表中查看组织名称 但是cant实际上选择它 我的错误在哪里 public class ToComboBoxModel extends AbstractListModel implemen
  • GridLayout 删除 JPanel 之间的填充

    我正在从事一个计算机科学项目 但我无法找到任何解决我的问题的方法 我正在创建一个二维数组JPanels 包含通过 a 的图像GridLayout 我想删除所有面板之间的填充 边距 以便它无缝地流入单个图像 但是 setHGap 和 setV
  • 当你在Java中使用Frame或JFrame时? [复制]

    这个问题在这里已经有答案了 可能的重复 swing 和 awt 有什么区别 https stackoverflow com questions 408820 what is the difference between swing and
  • 我应该在哪里以 Java MVC 模式调用我的 swingworker

    我有一个程序 其设置基本上与此 MVC 示例中的程序一样 http www leepoint net notes java GUI struct 40mvc html http www leepoint net notes java GUI
  • Java Swing:如何防止系统复制、剪切、粘贴操作?

    因此 我试图阻止用户通过按 control C control X control V 来使用默认系统操作 我想在这个特定的滚动窗格内的任何地方抓住钥匙 scrollPane 将组件加载到自身中 例如 JLabel scrollPane a
  • 我怎样才能将图像逐像素绘制到jframe

    我是java的初学者 直到今天我尝试做我自己认为的事情 所以这一天就在这里 我已经将图像的所有像素排列为 RGB 我想单击一个按钮并制作逐像素创建的类似动画的图像 这就是我所做的 但不起作用 import java awt BorderLa
  • Java Swing:为什么必须调整框架大小,以便可以显示已添加的组件

    我有一个简单的 Swing GUI 不仅如此 我编写的所有 swing GUI 运行它时 除了空白屏幕之外 它不会显示任何内容 直到我调整主框架的大小 因此每个组件都已重新绘制 我可以显示它们 这是我的简单代码 public static
  • JTextArea没有滚动条

    private JPanel contentPane public Driver setDefaultCloseOperation JFrame EXIT ON CLOSE setBounds 100 100 867 502 content
  • 如何读取文件,将数据放入JTable中,然后修改单元格/删除行并将数据保存到文件中? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要从 txt 文件中读取日期并将其放入 GUI 中的 JTable 中 然后修改一些记录或删除一些行并将新数据保存到文件中 我可以
  • 通过交换 UIDefaults 来改变外观

    我正在编写一个 GUI 生成器 希望用户能够更改他构建的 GUI 的 LookAndFeel 仅应更改编辑器区域内的组件的 LookAndFeel 应用程序的其余部分应保留在 SystemLookAndFeel 中 最大的问题是 LookA
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 有没有办法更改 JDialog 的所有者?

    我有一个非常具体的问题 我想知道是否有办法更改 JDialog 的所有者 可以使用构造函数设置 我想不存在 官方 的可能性 除了黑客攻击 但我想确保我没有错过任何东西 关于该主题的任何想法或提示都会有所帮助 谢谢 如果您的问题是如何在应用程
  • 设置滚动条粗细

    有没有办法调整滚动条的粗细JScrollPane 默认值有点笨拙 一个快速但又肮脏的解决方案是将宽度 高度明确设置为例如10 像素通过 jScrollPane getVerticalScrollBar setPreferredSize ne
  • Jsplitpane 自动调整大小

    我有一个 JSPlitPane 它们之间有 50 的分隔线 这工作正常 但是 当我在右侧添加一些 JLabels 时 jsplitpane 会忽略我的 50 分隔符 左侧窗格会增加其大小 并会挤压右侧窗格 为什么会发生这种情况以及如何解决
  • 使用Java开发跨平台,不同平台字体缩放不同

    我正在为我的大学制作一些软件 需要一个 GUI 在它的第一个版本中 我让它使用系统外观 因此它看起来像 Linux Mac Windows 中的本机应用程序 我发现这很麻烦 因为我必须根据操作系统使所有 JLabel 具有不同的大小 无论分
  • 更改 JComboBox 中选择的颜色(选择后)

    我正在使用 Swing 编写 GUI 我有一个定制的写法JComboBox用一个ListCellRenderer and a BasicComboBoxEditor In my getListCellRendererComponent 方法
  • 有哪些好方法可以控制 GridBagConstraints?

    我对 Swing 编程有点陌生 我发现尽管我很喜欢 GridBagLayout 的强大功能 但如果您有很多组件 那么就会有很多代码行只是设置布局的约束 除了使用可视化编辑器之外 还有哪些好方法可以控制这种情况 请记住 当您添加GridBag

随机推荐