Java - 在双显示器上移动未修饰的程序

时间:2015-08-10 10:18:24

标签: java jframe screen move

我制作了一个未修饰的Java程序。

我在双显示器上工作。

但是当我尝试在第二台显示器上移动程序时,它不起作用..

这是截图说明

enter image description here

所以我有两个课程:

Class Main.java:

package undecorated;

import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.SQLException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;






public class Main extends JFrame implements ActionListener, MouseListener {

private static final long serialVersionUID = 1L;


private static java.sql.Connection connexion = null;

private JMenuItem itemSeDeconnecter;
private JMenuItem itemAPropos;
private JMenuItem itemQuitter;
private JRadioButtonMenuItem itemJour;
private JRadioButtonMenuItem itemMois;
private JRadioButtonMenuItem itemAnnee;
private JButton close;
private JButton reduire;
private JButton punaise;
private JButton punaiseEpingler;
private JLabel logo;

private JMenuBar barreMenus;



protected CardLayout vues;
protected Container conteneur;

/**
 * Constructeur de la vue principale
 * 
 * @param modele
 * @param controleur
 * @throws SQLException
 * @throws ClassNotFoundException
 */
public Main() throws ClassNotFoundException, SQLException {
    super();



    barreMenus = new JMenuBar();
    JMenu menuFichier = new JMenu("Files");
    barreMenus.add(menuFichier);

    this.setUndecorated(true); // retirer bordure Windows/Mac
    // this.setAlwaysOnTop(true); // Forcer au premier plan
    this.setTitle("NEWS");
    // Image sur la barre des taches


    // this.setSize(720, 300);
    this.setMinimumSize(new Dimension(300, 300));
    this.setSize(405, 370);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

    this.vues = new CardLayout(2, 2);
    this.conteneur = this.getContentPane();
    this.conteneur.setLayout(this.vues);





    ComponentMover cm = new ComponentMover(this,barreMenus);
    this.setJMenuBar(barreMenus);


    this.setVisible(true);
}

@Override
public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}
public static void main(String[] args) throws ClassNotFoundException, SQLException{
Main main = new Main();
}
}

类ComponentMover.java:

package undecorated;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;
import javax.swing.SwingUtilities;

public class ComponentMover extends MouseAdapter
{
 private Insets dragInsets = new Insets(0, 0, 0, 0);
 private Dimension snapSize = new Dimension(1, 1);
 private Insets edgeInsets = new Insets(0, 0, 0, 0);
 private boolean changeCursor = true;
 private boolean autoLayout = false;

private Class destinationClass;
private Component destinationComponent;
private Component destination;
private Component source;

private Point pressed;
private Point location;

private Cursor originalCursor;
private boolean autoscrolls;
private boolean potentialDrag;


/**
 *  Constructor for moving individual components. The components must be
 *  regisetered using the registerComponent() method.
 */
public ComponentMover()
{
}

/**
 *  Constructor to specify a Class of Component that will be moved when
 *  drag events are generated on a registered child component. The events
 *  will be passed to the first ancestor of this specified class.
 *
 *  @param destinationClass  the Class of the ancestor component
 *  @param component         the Components to be registered for forwarding
 *                           drag events to the ancestor Component.
 */
public ComponentMover(Class destinationClass, Component... components)
{
    this.destinationClass = destinationClass;
    registerComponent( components );
}

/**
 *  Constructor to specify a parent component that will be moved when drag
 *  events are generated on a registered child component.
 *
 *  @param destinationComponent  the component drage events should be forwareded to
 *  @param components    the Components to be registered for forwarding drag
 *                       events to the parent component to be moved
 */
public ComponentMover(Component destinationComponent, Component... components)
{
    this.destinationComponent = destinationComponent;
    registerComponent( components );
}

/**
 *  Get the auto layout property
 *
 *  @return  the auto layout property
 */
public boolean isAutoLayout()
{
    return autoLayout;
}

/**
 *  Set the auto layout property
 *
 *  @param  autoLayout when true layout will be invoked on the parent container
 */
public void setAutoLayout(boolean autoLayout)
{
    this.autoLayout = autoLayout;
}

/**
 *  Get the change cursor property
 *
 *  @return  the change cursor property
 */
public boolean isChangeCursor()
{
    return changeCursor;
}

/**
 *  Set the change cursor property
 *
 *  @param  changeCursor when true the cursor will be changed to the
 *                       Cursor.MOVE_CURSOR while the mouse is pressed
 */
public void setChangeCursor(boolean changeCursor)
{
    this.changeCursor = changeCursor;
}

/**
 *  Get the drag insets
 *
 *  @return  the drag insets
 */
public Insets getDragInsets()
{
    return dragInsets;
}

/**
 *  Set the drag insets. The insets specify an area where mouseDragged
 *  events should be ignored and therefore the component will not be moved.
 *  This will prevent these events from being confused with a
 *  MouseMotionListener that supports component resizing.
 *
 *  @param  dragInsets
 */
public void setDragInsets(Insets dragInsets)
{
    this.dragInsets = dragInsets;
}

/**
 *  Get the bounds insets
 *
 *  @return  the bounds insets
 */
public Insets getEdgeInsets()
{
    return edgeInsets;
}

/**
 *  Set the edge insets. The insets specify how close to each edge of the parent
 *  component that the child component can be moved. Positive values means the
 *  component must be contained within the parent. Negative values means the
 *  component can be moved outside the parent.
 *
 *  @param  edgeInsets
 */
public void setEdgeInsets(Insets edgeInsets)
{
    this.edgeInsets = edgeInsets;
}

/**
 *  Remove listeners from the specified component
 *
 *  @param component  the component the listeners are removed from
 */
public void deregisterComponent(Component... components)
{
    for (Component component : components)
        component.removeMouseListener( this );
}

/**
 *  Add the required listeners to the specified component
 *
 *  @param component  the component the listeners are added to
 */
public void registerComponent(Component... components)
{
    for (Component component : components)
        component.addMouseListener( this );
}

/**
 *  Get the snap size
 *
 *  @return the snap size
 */
public Dimension getSnapSize()
{
    return snapSize;
}

/**
 *  Set the snap size. Forces the component to be snapped to
 *  the closest grid position. Snapping will occur when the mouse is
 *  dragged half way.
 */
public void setSnapSize(Dimension snapSize)
{
    if (snapSize.width < 1
    ||  snapSize.height < 1)
        throw new IllegalArgumentException("Snap sizes must be greater than 0");

    this.snapSize = snapSize;
}

/**
 *  Setup the variables used to control the moving of the component:
 *
 *  source - the source component of the mouse event
 *  destination - the component that will ultimately be moved
 *  pressed - the Point where the mouse was pressed in the destination
 *      component coordinates.
 */
@Override
public void mousePressed(MouseEvent e)
{
    source = e.getComponent();
    int width  = source.getSize().width  - dragInsets.left - dragInsets.right;
    int height = source.getSize().height - dragInsets.top - dragInsets.bottom;
    Rectangle r = new Rectangle(dragInsets.left, dragInsets.top, width, height);

    if (r.contains(e.getPoint()))
        setupForDragging(e);
}

private void setupForDragging(MouseEvent e)
{
    source.addMouseMotionListener( this );
    potentialDrag = true;

    //  Determine the component that will ultimately be moved

    if (destinationComponent != null)
    {
        destination = destinationComponent;
    }
    else if (destinationClass == null)
    {
        destination = source;
    }
    else  //  forward events to destination component
    {
        destination = SwingUtilities.getAncestorOfClass(destinationClass, source);
    }

    pressed = e.getLocationOnScreen();
    location = destination.getLocation();

    if (changeCursor)
    {
        originalCursor = source.getCursor();
        source.setCursor( Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR) );
    }

    //  Making sure autoscrolls is false will allow for smoother dragging of
    //  individual components

    if (destination instanceof JComponent)
    {
        JComponent jc = (JComponent)destination;
        autoscrolls = jc.getAutoscrolls();
        jc.setAutoscrolls( false );
    }
}

/**
 *  Move the component to its new location. The dragged Point must be in
 *  the destination coordinates.
 */
@Override
public void mouseDragged(MouseEvent e)
{
    Point dragged = e.getLocationOnScreen();
    int dragX = getDragDistance(dragged.x, pressed.x, snapSize.width);
    int dragY = getDragDistance(dragged.y, pressed.y, snapSize.height);

    int locationX = location.x + dragX;
    int locationY = location.y + dragY;

    //  Mouse dragged events are not generated for every pixel the mouse
    //  is moved. Adjust the location to make sure we are still on a
    //  snap value.

    while (locationX < edgeInsets.left)
        locationX += snapSize.width;

    while (locationY < edgeInsets.top)
        locationY += snapSize.height;

    Dimension d = getBoundingSize( destination );

    while (locationX + destination.getSize().width + edgeInsets.right > d.width)
        locationX -= snapSize.width;

    while (locationY + destination.getSize().height + edgeInsets.bottom > d.height)
        locationY -= snapSize.height;

    //  Adjustments are finished, move the component

    destination.setLocation(locationX, locationY);
}

/*
 *  Determine how far the mouse has moved from where dragging started
 *  (Assume drag direction is down and right for positive drag distance)
 */
private int getDragDistance(int larger, int smaller, int snapSize)
{
    int halfway = snapSize / 2;
    int drag = larger - smaller;
    drag += (drag < 0) ? -halfway : halfway;
    drag = (drag / snapSize) * snapSize;

    return drag;
}

/*
 *  Get the bounds of the parent of the dragged component.
 */
private Dimension getBoundingSize(Component source)
{
    if (source instanceof Window)
    {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        Rectangle bounds = env.getMaximumWindowBounds();
        return new Dimension(bounds.width, bounds.height);
    }
    else
    {
        return source.getParent().getSize();
    }
}

/**
 *  Restore the original state of the Component
 */
@Override
public void mouseReleased(MouseEvent e)
{
    if (!potentialDrag) return;

    source.removeMouseMotionListener( this );
    potentialDrag = false;

    if (changeCursor)
        source.setCursor( originalCursor );

    if (destination instanceof JComponent)
    {
        ((JComponent)destination).setAutoscrolls( autoscrolls );
    }

    //  Layout the components on the parent container

    if (autoLayout)
    {
        if (destination instanceof JComponent)
        {
            ((JComponent)destination).revalidate();
        }
        else
        {
            destination.validate();
        }
    }
}
}

有什么想法吗?

0 个答案:

没有答案