0

私が達成したいのは、2 つの JFrame を作成することです。1 つは画面全体をカバーし、ユーザーがその画面をクリックすると、ユーザーがマウスをクリックしてドラッグすると、新しい JFrame が表示されます。ユーザーが最初にクリックした場所は新しい JFrame の左上隅であり、ユーザーがマウスを離した場所は JFrame の右下隅です。2 つの JFrame を作成し、マウスをクリックして離したときに 2 つ目の 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

4 に答える 4

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);
    }
}

NBは別のスレッドを開始invokeLater()しません。新しいスレッドを作成し、そのメソッドを呼び出す必要があります。invokeLater()run()

于 2013-06-25T01:31:29.210 に答える
0

Swing はシングルスレッドのフレームワークです。つまり、単一のスレッドを使用して、すべてのイベントをすべての関係者にディスパッチします。

このスレッドをブロックするもの ( infinate などwhile-loop) がある場合、スレッドは、再描画要求を含め、アプリケーションに着信する新しいイベントを処理できません。これにより、アプリケーションがハングしたように見えます (この場合、実際にはハングしています)。

詳細については、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();

            }

        }

    }
}
于 2013-06-25T01:34:45.997 に答える