JFrame-Ereignisse zur Größenänderung abhören, wenn der Benutzer seine Maus zieht?

Lesezeit: 6 Minuten

Wenn ein Benutzer auf die Ecke eines JFrame klickt, um die Größe zu ändern, und die Maus herumzieht, wird der JFrame basierend auf der aktuellen Position der Maus neu gezeichnet, während der Benutzer zieht. Wie können Sie sich diese Ereignisse anhören?

Unten ist das, was ich derzeit versucht habe:

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

Wie kann ich bestimmen und einschränken, wie der Benutzer die Größe eines Fensters ändert (basierend auf dem aktuellen Seitenverhältnis des Fensters), während er die Maus herumzieht?

  • @finnw kannst du bitte den Grund für dein Kopfgeld klären, weil ich einen Unterschied zwischen ihnen sehe Java_1.4 und Java_1.5aber ich kann keinen Unterschied für finden Java_6, note aber ohne tiefste Einsicht Nested und Inherits Method

    – mKorbel

    6. Oktober 2011 um 8:53 Uhr

  • @mKorbel, ich habe beide Methoden ausprobiert (ComponentListener auf JPanel; Override validate.) Der Code wird unter beiden Java-Versionen kompiliert und ausgeführt, aber in Java 1.6 wird das Layout kontinuierlich neu berechnet, in Java 1.5 jedoch nur, wenn ich die Maus loslasse.

    – finnw

    6. Oktober 2011 um 12:17 Uhr

  • @finnw ändern Sie die Größe von JComponent oder JFrame

    – mKorbel

    6. Oktober 2011 um 12:23 Uhr

  • @mKorbel, ich ändere die Größe des JFrame mit der Maus, und da es a BorderLayout Die Komponente (mit BorderLayout.CENTER) sollte folgen.

    – finnw

    6. Oktober 2011 um 12:30 Uhr

  • ComponentResizer von @camickr tips4java.wordpress.com/2009/09/13/resizing-components wäre aus dem Java5-Alter,

    – mKorbel

    6. Oktober 2011 um 12:37 Uhr

Benutzer-Avatar
Alex Ntousias

Sie können einen Komponenten-Listener hinzufügen und die Funktion „componentResized“ folgendermaßen implementieren:

JFrame component = new JFrame("My Frame");

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

BEARBEITEN: Anscheinend ist für JFrame das Ereignis „componentResized“ mit dem Ereignis „mouseReleased“ verbunden. Deshalb wird die Methode aufgerufen, wenn die Maustaste losgelassen wird.

Eine Möglichkeit, das zu erreichen, was Sie möchten, besteht darin, ein JPanel hinzuzufügen, das den gesamten Bereich Ihres JFrame abdeckt. Fügen Sie dann den componentListener zum JPanel hinzu (componentResized für JPanel wird aufgerufen, selbst wenn Ihre Maus noch zieht). Wenn die Größe Ihres Rahmens geändert wird, wird auch die Größe Ihres Panels geändert.

Ich weiß, das ist nicht die eleganteste Lösung, aber es funktioniert!

  • Danke für die prompte Antwort. Die Komponente Resized scheint jedoch nur aufgerufen zu werden, wenn der Benutzer die Maustaste loslässt. Ist es möglich, Größenänderungsereignisse abzuhören als der Benutzer zieht die Maus?

    – Clinton

    21. Januar 2010 um 1:50 Uhr


  • @Clinton Stimmt! Tut mir leid, ich habe deine Frage nicht gründlich gelesen!

    – Alex Ntousias

    21. Januar 2010 um 1:56 Uhr

  • @Clinton Ich war neugierig, wie das gemacht werden kann, und die einzige Möglichkeit, die ich gefunden habe, bestand darin, ein JPanel im JFrame hinzuzufügen. Ich weiß nicht, ob dir das hilft. Ich habe meine Antwort aktualisiert.

    – Alex Ntousias

    21. Januar 2010 um 3:03 Uhr

  • Danke für deine überarbeitete Lösung. Ich habe es versucht und es hat gut funktioniert. In meinem Fall kam die Validierungsoption jedoch etwas sauberer heraus.

    – Clinton

    21. Januar 2010 um 23:27 Uhr

  • +1 weil ich die Funktion nicht in einer separaten Klasse überschreiben müsste! 🙂 Diese Antwort hilft auch nach 5 Jahren weiter.

    – Einbrecher

    13. November 2015 um 12:12 Uhr

Eine andere Problemumgehung (die der von Alex sehr ähnlich, aber etwas unkomplizierter ist) besteht darin, die Ereignisse von abzuhören JFramestattdessen das Stammfenster von :

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

Abhängig von anderen Implementierungsdetails ist es möglich, dass der Stammbereich geändert wird. Wenn das eine Möglichkeit ist, dann könnten Sie überschreiben setRootPane() und damit umgehen. Seit setRootPane() geschützt ist und nur vom Konstruktor aufgerufen wird, ist es unwahrscheinlich, dass Sie das tun müssen.

  • Sollte es nicht sein public void TestFrame() {…?

    – Anonymer Pinguin

    5. Januar 2014 um 2:53 Uhr

  • @AnnonomusPenguin, nein, das ist eine Konstruktordeklaration, und Konstruktoren geben keine Rückgabetypen wie z void.

    – Zeichnete Noakes

    10. August 2014 um 1:50 Uhr

  • “// Dies wird nur aufgerufen, wenn der Benutzer die Maustaste loslässt.” — es scheint, dass dies nicht nur beim Loslassen der Maustaste der Fall ist. Wenn ich diesen Code verwende, wird er ununterbrochen aufgerufen, was eine dynamische Größenänderung unterstützen würde; eine Möglichkeit, die Größe einmal beim Loslassen der Maus zu ändern?

    – MAXdB

    12. August 2019 um 20:27 Uhr


  • copy @MAXdB: Gibt es eine Möglichkeit, die Größe beim Loslassen der Maus einmal zu ändern?

    – H. Sheng

    16. März 2021 um 17:28 Uhr


Sie müssen wahrscheinlich etwas wie überschreiben validate (Vergessen Sie nicht, den Super anzurufen). Natürlich funktioniert das möglicherweise immer noch nicht, wenn Sie ein Fenstersystem verwenden, das zum Ziehen von Umrissen konfiguriert ist.

  • Wie würde ich den Super dafür anrufen? Ich dachte, Sie könnten in einem Konstruktor nur super aufrufen?

    – Tim van Dalen

    9. Juni 2011 um 16:55 Uhr

Benutzer-Avatar
Pjadav

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

}

1014300cookie-checkJFrame-Ereignisse zur Größenänderung abhören, wenn der Benutzer seine Maus zieht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy