随着它的变化实时显示JFrame

时间:2013-06-25 01:06:31

标签: java swing jframe mouseevent

所以我想要完成的是创建两个JFrame。一个将覆盖整个屏幕,当用户点击该屏幕时,当用户点击并拖动鼠标时,会出现一个新的JFrame。用户首次单击的位置是新JFrame的左上角,用户释放鼠标的位置是JFrame的右下角。我没有问题制作两个JFrames并在点击和释放鼠标时显示第二个JFrame。问题是我希望新的JFrame在用户移动鼠标时实时显示,因此在释放鼠标之前。我试过了

public void mouseDragged(MouseEvent e) {

            FrontWindow f = new FrontWindow();

            while (true) {          
                f.setBounds(Shared.xPressed, Shared.yPressed, (Utils.getXPosition() - Shared.xPressed) , (Utils.getYPosition() - Shared.yPressed));
                f.setVisible(true);
            }

        }

但那没用。

4 个答案:

答案 0 :(得分:4)

不需要while循环。将生成多个mouseDragged()事件。

您应该在mousePressed()事件上创建新框架。然后,当生成每个mouseDragged()事件时,您可以更改框架的大小。

当然这不会很好看,因为拖动不会与帧的大小同步。更好的方法是在移动鼠标时绘制一个矩形。然后在mouseReleased上创建并以绘制的矩形大小显示框架。

有关使用鼠标绘制矩形的基础知识,请参阅Custom Paint Approaches。在您的情况下,您可能希望使用Glass Pane来处理鼠标事件和绘制矩形。

答案 1 :(得分:2)

while (true)事件处理程序中的

mouseDragged()阻止了Swing的事件调度程序线程(EDT)。这意味着您的程序不会收到任何其他事件。因此,当用户首次开始拖动鼠标时,您将启动此无限循环。但操作系统无法通知您,当用户拖动鼠标时,鼠标会继续移动,因为您已阻止其执行此操作。

答案 2 :(得分:0)

尝试使用MouseInfo.getPointerInfo().getLocation()

在单独的主题中运行SwingUtilities.invokeLater()
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        Point mp = MouseInfo.getPointerInfo().getLocation();
        f.setBounds(Shared.xPress, Shared.yPress, mp.x - Shared.xPress, mp.y - Shared.yPressed);
    }
}

N.B。 invokeLater() 启动单独的帖子。您应该创建新线程,并在其invokeLater()方法中调用run()

答案 3 :(得分:0)

Swing是一个单线程框架。也就是说,它使用单个线程将所有事件发送给所有相关方。

如果有任何阻塞此线程(例如infinate while-loop),则线程无法处理进入应用程序的任何新事件,包括重绘请求。这将使您的应用程序看起来像挂起(在您的情况下,实际上它已经存在)。

请查看Concurrency in Swing了解详情。

以下示例允许用户在窗口表面上单击/拖动,它将呈现一个表示拖动过程的矩形。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawRectangle {

    public static void main(String[] args) {
        new DrawRectangle();
    }

    public DrawRectangle() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Rectangle dragRect;

        public TestPane() {

            MouseHandler handler = new MouseHandler();
            addMouseListener(handler);
            addMouseMotionListener(handler);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (dragRect != null) {
                g2d.setColor(Color.DARK_GRAY);
                g2d.draw(dragRect);
            }
            g2d.dispose();
        }

        public class MouseHandler extends MouseAdapter {

            private Point clicked;

            @Override
            public void mousePressed(MouseEvent e) {
                clicked = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseDragged(MouseEvent e) {

                Point p = e.getPoint();

                int x = Math.min(p.x, clicked.x);
                int y = Math.min(p.y, clicked.y);

                int width = Math.max(p.x, clicked.x) - x;
                int height = Math.max(p.y, clicked.y) - y;

                dragRect = new Rectangle(x, y, width, height);
                repaint();

            }

        }

    }
}
相关问题