mousemoved mouseclicked event ejemplo clicked java swing user-interface mouse

java - mouseclicked - ¿Escuchar JFrame resize eventos mientras el usuario arrastra su mouse?



mouseclicked java swing (4)

Cuando un usuario hace clic en la esquina de un JFrame para cambiar el tamaño y arrastra el mouse, JFrame lo vuelve a dibujar en función de la posición actual del mouse a medida que el usuario arrastra. ¿Cómo puedes escuchar estos eventos?

A continuación se muestra lo que he intentado actualmente:

public final class TestFrame extends JFrame { public TestFrame() { this.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { // This is only called when the user releases the mouse button. System.out.println("componentResized"); } }); } // These methods do not appear to be called at all when a JFrame // is being resized. @Override public void setSize(int width, int height) { System.out.println("setSize"); } @Override public void setBounds(Rectangle r) { System.out.println("setBounds A"); } @Override public void setBounds(int x, int y, int width, int height) { System.out.println("setBounds B"); } }

¿Cómo puedo determinar y restringir cómo el usuario cambia el tamaño de una ventana (según la relación de aspecto actual de la ventana) mientras arrastran el mouse?


Otra solución (que es muy similar a la de Alex, pero un poco más directa) es escuchar los eventos desde el panel raíz de JFrame en su lugar:

public final class TestFrame extends JFrame { public TestFrame() { this.getRootPane().addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { // This is only called when the user releases the mouse button. System.out.println("componentResized"); } }); } }

Dependiendo de otros detalles de implementación, es posible que el panel raíz pueda ser cambiado. Si eso es una posibilidad, entonces puede anular setRootPane() y lidiar con eso. Como setRootPane() está protegido y solo se llama desde el constructor, es poco probable que deba hacer eso.


Probablemente necesites anular algo como validate (no olvides llamar al súper). Por supuesto, aún puede no funcionar si está utilizando un sistema de ventanas configurado para arrastrar contornos.


Puede agregar un detector de componentes e implementar la función componentResized así:

JFrame component = new JFrame("My Frame"); component.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent evt) { Component c = (Component)evt.getSource(); //........ } });

EDITAR: Aparentemente, para JFrame, el evento componentResized está enganchado al evento MouseReleased. Es por eso que se invoca el método cuando se suelta el botón del mouse.

Una forma de lograr lo que desea es agregar un JPanel que cubra toda el área de su JFrame. A continuación, agregue el componentListener al JPanel (componenteResized para JPanel se llama incluso mientras el mouse aún está arrastrando). Cuando se cambie el tamaño de su marco, su panel también se redimensionará.

Lo sé, esta no es la solución más elegante, ¡pero funciona!


public class MouseDrag extends Component implements MouseListener, MouseMotionListener { /** The Image we are to paint */ Image curImage; /** Kludge for showStatus */ static Label status; /** true if we are in drag */ boolean inDrag = false; /** starting location of a drag */ int startX = -1, startY = -1; /** current location of a drag */ int curX = -1, curY = -1; // "main" method public static void main(String[] av) { JFrame f = new JFrame("Mouse Dragger"); Container cp = f.getContentPane(); if (av.length < 1) { System.err.println("Usage: MouseDrag imagefile"); System.exit(1); } Image im = Toolkit.getDefaultToolkit().getImage(av[0]); // create a MouseDrag object MouseDrag j = new MouseDrag(im); cp.setLayout(new BorderLayout()); cp.add(BorderLayout.NORTH, new Label( "Hello, and welcome to the world of Java")); cp.add(BorderLayout.CENTER, j); cp.add(BorderLayout.SOUTH, status = new Label()); status.setSize(f.getSize().width, status.getSize().height); f.pack(); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } // "Constructor" - creates the object public MouseDrag(Image i) { super(); curImage = i; setSize(300, 200); addMouseListener(this); addMouseMotionListener(this); } public void showStatus(String s) { status.setText(s); } // Five methods from MouseListener: /** Called when the mouse has been clicked on a component. */ public void mouseClicked(MouseEvent e) { } /** Called when the mouse enters a component. */ public void mouseEntered(MouseEvent e) { } /** Called when the mouse exits a component. */ public void mouseExited(MouseEvent e) { } // And two methods from MouseMotionListener: public void mouseDragged(MouseEvent e) { Point p = e.getPoint(); // System.err.println("mouse drag to " + p); showStatus("mouse Dragged to " + p); curX = p.x; curY = p.y; if (inDrag) { repaint(); } } public void paint(Graphics g) { int w = curX - startX, h = curY - startY; Dimension d = getSize(); g.drawImage(curImage, 0, 0, d.width, d.height, this); if (startX < 0 || startY < 0) return; System.err.println("paint:drawRect @[" + startX + "," + startY + "] size " + w + "x" + h); g.setColor(Color.red); g.fillRect(startX, startY, w, h); } }