`
xiaosunzhu
  • 浏览: 7827 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

swing窗口边界背景滚动以及对鼠标的吸附

阅读更多

  最近想用swing做一个设想的demo,涉及到背景卷动,虽然我自己也觉得swing的界面不怎么样,但做着玩一玩也没啥。

  下面的代码(仅贴出相关代码,其他省略)具体功能是鼠标移向左右边界时,有吸附效果,并且横向x轴坐标滚动,鼠标加速度小于数值时,控制鼠标无法移出窗口。当然,这只是简易实现,很多地方都还要完善,而且可能也并不是最好的,希望大家可以交流更好的方式。

 

    private static final int FPS = 30;

    private static final int FRAME_WIDTH = 800;
    private static final int BORDER_WIDTH = 4;
    private static final int BORDER_BACK_WIDTH = BORDER_WIDTH + 5;
    private static final int MOVE_BORDER_WIDTH = BORDER_BACK_WIDTH + 2;
    private static final int BORDER_CHECK_WIDTH = MOVE_BORDER_WIDTH + 5;

    private static final int BORDER_BACK_RIGHT = FRAME_WIDTH - BORDER_BACK_WIDTH;
    private static final int MOVE_BORDER_RIGHT = FRAME_WIDTH - MOVE_BORDER_WIDTH;
    private static final int BORDER_CHECK_RIGHT = FRAME_WIDTH - BORDER_CHECK_WIDTH;

    private static final int MOVE_SPEED = 4;

    private boolean moreLeft = false;
    private boolean moreRight = false;

    private int bgWidth;
    private int bgPosXOfImage = 0;
    private int mouseLastX = 0;

    private final Robot robot;

    public Home() throws AWTException {
        initComponents();

        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice device = env.getDefaultScreenDevice();
        robot = new Robot(device);

        bgWidth = 1000;//just stub

        ScheduledExecutorService refreshSchedule = new ScheduledThreadPoolExecutor(1);
        refreshSchedule.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                refreshUI();
            }
        }, 1000 / FPS, 1000 / FPS, TimeUnit.MILLISECONDS);

    }



    private void refreshUI() {
        if (moreLeft && bgPosXOfImage >= MOVE_SPEED) {
            moveLeft();
            drawBGImage();
        }

        if (moreRight && (bgPosXOfImage + FRAME_WIDTH) <= (bgWidth - MOVE_SPEED)) {
            moveRight();
            drawBGImage();
        }
    }

    private void moveRight() {
        bgPosXOfImage += MOVE_SPEED;
    }



    private void moveLeft() {
        bgPosXOfImage -= MOVE_SPEED;
    }

    private void drawBGImage() {
        System.out.println("drawBG x:" + bgPosXOfImage);
    }

    /*
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                onMouseMoved(e);
            }
        });
    */
    private void onMouseMoved(MouseEvent e) {
        int x = e.getX();
        int zeroXPosOnScreen = e.getXOnScreen() - x;

        if (x > BORDER_CHECK_WIDTH && x < BORDER_CHECK_RIGHT) {
            moreLeft = moreRight = false;
            mouseLastX = x;
            return;
        }

        if (x < mouseLastX && x <= BORDER_CHECK_WIDTH && x > MOVE_BORDER_WIDTH) {
            robot.mouseMove(zeroXPosOnScreen + (x = MOVE_BORDER_WIDTH), e.getYOnScreen());
        }
        if (x > mouseLastX && x >= BORDER_CHECK_RIGHT && x < MOVE_BORDER_RIGHT) {
            robot.mouseMove(zeroXPosOnScreen + (x = MOVE_BORDER_RIGHT), e.getYOnScreen());
        }

        if (x <= MOVE_BORDER_WIDTH) {
            moreLeft = true;
            moreRight = false;
            if (x <= BORDER_BACK_WIDTH) {
                robot.mouseMove(zeroXPosOnScreen + MOVE_BORDER_WIDTH, e.getYOnScreen());
            }
        }

        if (x >= MOVE_BORDER_RIGHT) {
            moreLeft = false;
            moreRight = true;
            if (x >= BORDER_BACK_RIGHT) {
                robot.mouseMove(zeroXPosOnScreen + MOVE_BORDER_RIGHT, e.getYOnScreen());
            }
        }

        mouseLastX = x;
    }

    /*
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent e) {
                onMouseExited();
            }
        });
    */
    private void onMouseExited() {
        moreLeft = false;
        moreRight = false;
    }

 

分享到:
评论

相关推荐

    java获取鼠标坐标位置swing

    这些库包含了创建窗口、按钮等组件以及处理鼠标事件的类。 ```java import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; ``` ...

    swing多窗口联动的实现示例

    在Java的Swing库中,开发GUI应用程序时,我们经常需要处理多个窗口之间的交互和数据共享,这在实际应用中非常常见,例如在一个主窗口进行操作,然后更新其他子窗口的信息。本示例"swing多窗口联动的实现示例"就是...

    Java Swing自定义标签边界.rar

    Java基于要SWing技术自定义标签的边界效果,通过javax.swing.border.Border 接口,进行自定义边界类OwnBorder。可以实现空边界(EmptyBorder)、斜切边界(BevelBorder)、蚀刻边界(EtchedBorder)、线条边界...

    Swing下滚动条实现仿分页

    2. 对JScrollPane的滚动事件监听,以捕捉滚动条的变化并更新JTable。 3. 可能还有布局管理器的定制,以确保固定列和可滚动列的正确排列。 总的来说,这个项目展示了如何利用Swing的组件和事件处理机制来创建一个...

    swing窗口旋转关闭

    在Swing窗口旋转关闭这一主题中,我们将深入探讨如何利用Swing组件和方法来实现窗口的旋转效果以及自定义窗口关闭操作。 首先,Swing中的主要窗口类是`JFrame`,它是顶级容器,用于创建应用程序的主要窗口。要创建...

    swing带滚动条的多选下拉选择框(name code形式)

    在Java的Swing库中,开发用户界面时经常会遇到需要创建具有滚动条的多选下拉选择框的需求。这样的组件可以提供丰富的交互性,并且在选项较多时,用户可以通过滚动条方便地浏览和选择。标题提到的"swing带滚动条的...

    java swing 鼠标自动移动

    综上所述,"java swing 鼠标自动移动"项目结合了Java Swing GUI编程、鼠标事件处理、Robot类的使用、以及应用打包技术,为开发者提供了一个实用的示例,展示了如何在Java环境中实现鼠标自动移动。

    java Swing 气泡浮动提示窗口代码

    总的来说,这段代码提供了一种在Swing应用中实现气泡浮动提示窗口的方法,通过自定义组件和布局,结合颜色、字体等设计元素,以及动画效果,创建了一个具有视觉吸引力且功能完备的提示机制。开发者可以根据实际需求...

    Swing窗口美化包.zip

    这个库特别注重细节,例如窗口边框、按钮、滚动条等组件的样式,使得Swing应用看起来更加专业和精致。 Substance库则是另一种Swing界面美化工具,它提供了超过50种不同的皮肤,每种皮肤都有多种颜色方案。Substance...

    swing 鼠标事件 loading效果

    本篇文章将深入探讨如何在Swing应用中实现鼠标事件以及加载效果。 首先,让我们了解Swing中的鼠标事件。Swing提供了多种鼠标事件类,如`MouseEvent`, `MouseAdapter`, `MouseListener`和`MouseMotionListener`。`...

    swing鼠标右键功能实现

    在Swing中实现鼠标右键功能,主要是通过`MouseListener`监听鼠标事件,特别是`mouseClicked`事件中的右键单击行为。同时,需要使用`JPopupMenu`来创建弹出式菜单,显示用户定义的菜单项。以下是根据提供的代码和描述...

    抽象窗口工具包 (AWT)和Swing

    【抽象窗口工具包 (AWT) 和 Swing 的概念及区别】 AWT(Abstract Window Toolkit)是Java早期提供的用于创建图形用户界面(GUI)的基础框架,它由Java标准版(Java SE)提供。AWT组件是操作系统原生组件的代理,...

    swing中的滚动条.doc

    在Java Swing中,滚动条(JScrollPane)是用于在用户界面中提供滚动功能的重要组件,它允许用户查看超出视口大小的组件内容。`JScrollPane`不仅包含滚动条,还包含一个称为ViewPort的特殊区域,这个区域显示的是实际...

    swing之滚动条下拉加载数据源码

    在Java的Swing库中,滚动条(Scrollbar)和下拉加载(Pull Down)是两个重要的组件,它们常用于创建用户界面,特别是处理大量数据时。`swing之滚动条下拉加载数据源码`这个标题暗示了我们将在 Swing 应用程序中实现...

    Swing导航按钮——鼠标拖动按钮变换位置

    总结来说,"Swing导航按钮——鼠标拖动按钮变换位置"这个例子涉及到Swing组件的自定义、鼠标事件处理以及组件位置的动态调整,是学习Swing高级特性和用户交互设计的好素材。通过实践和理解这个例子,开发者可以提升...

    swing 鼠标绘画

    本项目聚焦于"Swing鼠标绘画",这是一个利用Swing实现的简单但有趣的功能,允许用户通过鼠标在界面上进行绘画创作,对Java初学者来说,这是一个很好的学习实践案例。 Swing库是Java Foundation Classes (JFC) 的一...

    javaSwing各种主题窗口

    在压缩包文件"FrameOfSwing"中,很可能包含了展示如何创建和自定义Swing框架(Frame)以及使用不同LookAndFeel的示例代码。通过研究这些示例,开发者可以更好地理解如何在实际项目中应用和调整Swing的窗口主题。在...

    Java在Swing窗口上实现文字超链接.rar

    在Java的Swing库中创建GUI应用程序时,有时我们需要在窗口上添加超链接,以便用户可以点击并跳转到特定的网页。这个“Java在Swing窗口上实现文字超链接.rar”文件提供了一个示例,展示了如何在Swing组件中实现这种...

    swing实现布局+滚动+自定义table+组件

    swing实现布局+滚动+自定义table+组件

    Java Swing实现窗体添加背景图片的2种方法详解

    在Java Swing中,创建美观的用户界面通常需要对窗体进行一定程度的定制,其中一种常见的需求就是添加背景图片。本文将详细介绍两种在Java Swing中实现窗体添加背景图片的方法,并探讨Swing重绘过程中的`repaint()`和...

Global site tag (gtag.js) - Google Analytics