Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

JFrame screen edge docking / snapping

843807Oct 24 2009 — edited Oct 24 2009
Hi Swingers,

I consider myself a good searcher, and I have searched far and wide before posting here, but sadly I have found almost nothing on the dilemma
that I cannot dock a window or JFrame on the edge of my screen.

I did however find only one site that mentioned screen docking with some code, but it is only overriding via a window listener when dragging near the
screen edge, and results in a very ugly repositioning back and forth when dragging the frame.

If there is some library or a way around the issues I have found... I would be most grateful for a solution,

Here is an example of what I am describing...
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class WindowSnapper extends ComponentAdapter {

  private boolean locked = false;

  private int sd = 50;

  public void componentMoved(ComponentEvent evt) {
    if (locked)
      return;
    Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
    int nx = evt.getComponent().getX();
    int ny = evt.getComponent().getY();
    // top
    if (ny < 0 + sd) {
      ny = 0;
    }
    // left
    if (nx < 0 + sd) {
      nx = 0;
    }
    // right
    if (nx > size.getWidth() - evt.getComponent().getWidth() - sd) {
      nx = (int) size.getWidth() - evt.getComponent().getWidth();
    }
    // bottom
    if (ny > size.getHeight() - evt.getComponent().getHeight() - sd) {
      ny = (int) size.getHeight() - evt.getComponent().getHeight();
    }
    // make sure we don't get into a recursive loop when the
    // set location generates more events
    locked = true;
    evt.getComponent().setLocation(nx, ny);
    locked = false;
  }

  public static void main(String[] args) {
    JFrame frame = new JFrame("");
    JLabel label = new JLabel("Move this window's title bar to demonstrate screen edge snapping.");
    frame.getContentPane().add(label);
    frame.pack();

    frame.addComponentListener(new WindowSnapper());
    frame.setVisible(true);
  }
}
thank you kindly,

Dax
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 21 2009
Added on Oct 24 2009
2 comments
701 views