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实现窗体拖拽和拉伸 的相关文章

  • JMenuItems 在 JLayeredPane 中的较高组件上绘制

    我在 JLayeredPane 的一层上的 JPanel 中有一组 JMenuItem 并在更高层的 JPanel 中绘制了一个模拟光标 当菜单项重新绘制时 它们会在模拟光标上绘制 不会触发光标层的重新绘制 有趣的是 如果我用 JButto
  • 按下了 JSpinner 的哪个按钮?

    是否有可能知道 从从 JSpinner 接收 ChangeEvent 的 ChangeListener 内部 按下了哪个按钮 递增 递减 简短回答 不 无法知道按下了哪个按钮 长答案 根据您的模型和更改监听器 如果您对新值和之前的值进行比较
  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • 在 Swing 中使用印度语输入法输入文本时不显示英文字符

    我正在开发一个应用程序 它接受英语文本并使用自定义的第 3 方 API 将音译为印度语 受支持的几种语言之一 该应用程序针对 Windows XP 7 和 Ubuntu 我们使用自定义输入法来加载所需的印度语字体 并使用它渲染文本 此外 用
  • java中如何制作弹出窗口

    我目前正在开发一个java应用程序 我想显示一个包含文本区域和按钮的新窗口 你有什么想法 同样的答案 J选项面板 http docs oracle com javase 7 docs api javax swing JOptionPane
  • 如何在 JTextArea 行计数中考虑换行?

    我知道这一点thread https stackoverflow com questions 6366776 how to count the number of lines in a jtextarea including those c
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • setToolTipText 消耗鼠标事件的解决方法?

    这似乎是 SWING 已验证的问题 http forums sun com thread jspa threadID 385730 http forums sun com thread jspa threadID 385730 我目前正在尝
  • Swing GUI 出现 IntelliJ 错误“contentPane 无法设置为 null。”从终端编译时

    当我从 IntelliJ 编译我的项目时 没有任何问题 我的程序运行顺利 但是当我尝试使用 javac 从终端编译它时 警告 注意 Victor presentation TableControllerMenu java 使用未经检查或不安
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • 添加可滚动 JTextArea (Java)

    我正在尝试向 JTextArea 添加滚动条 有人可以告诉我下面的代码我做错了什么吗 JFrame frame new JFrame Test JTextArea textArea new JTextArea Test JScrollPan
  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 顽固的 JComboBox

    我有一个 JComboBox 如下面的代码所示 当程序启动时 其 actionPerformed 事件立即触发 导致一些空指针异常 因此我想从不选择任何元素的情况开始 但是 由于某种原因它不起作用 无论我做什么 它总是以显示 USD TRY
  • JTable 和 JScrollpane 大小的问题

    我有一个JScrollPane with a JTable在里面 在里面JTable我最初有 3 行 稍后添加行 默认JTable我的 3 行很难看 因为JScrollPane calls getPreferredScrollableVie
  • 使用 Spring 进行 Swing GUI 开发

    是否有任何使用 Spring 最好是 v3 构建 Swing GUI 应用程序的不错的教程 这是可能的 但如果您想使用 GUI 构建器 则无法通过 spring 初始化任何 GUI 组合 所以你不能使用依赖注入之类的东西 Spring 管理
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n

随机推荐