2

私は装飾のない jFrame を持っていますが、GUI だけがグラフィックス GD によって描画されます。ユーザーにこのウィンドウのサイズを変更してもらいたいのですが、境界線なしでは変更できません。そこで、特別な位置からドラッグされたときにサイズを変更するマウス リスナーを作成しました。少しは動きますが、止まるまで遠くまでは伸びません。もっと簡単な方法はありますか?他の選択肢はありますか?純粋なGDでこれを行ったことがありますか?

 this.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
  posX=e.getX();
  posY=e.getY();

}     

 }}); 

 this.addMouseMotionListener(new MouseAdapter()
{
 public void mouseDragged(MouseEvent evt)
 {
if (posX >= getWidth()-25 && posY >=getHeight()-45){
int nlx= evt.getXOnScreen()-(location().x-12);
int nly= evt.getYOnScreen()-(location().y-32);

        setSize(nlx,nly);
 setBackground(new Color(0, 0, 0, 0));
 invalidate(); 
    }else{
    setLocation (evt.getXOnScreen()-posX,evt.getYOnScreen()-posY);

    }

 }
 });  
}
4

2 に答える 2

2

これは、私が長い間使用している完全なマウス アダプターです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

/**
 * @see http://stackoverflow.com/a/12456113/909085
 */

public class WindowResizeAdapter extends MouseAdapter implements SwingConstants
{
    private boolean resizing = false;
    private int prevX = -1;
    private int prevY = -1;

    private int resizeSide = 0;

    public static void install ( Component component, int resizeSide )
    {
        WindowResizeAdapter wra = new WindowResizeAdapter ( resizeSide );
        component.addMouseListener ( wra );
        component.addMouseMotionListener ( wra );
    }

    public WindowResizeAdapter ( int resizeSide )
    {
        super ();
        this.resizeSide = resizeSide;
    }

    public void mousePressed ( MouseEvent e )
    {
        if ( SwingUtilities.isLeftMouseButton ( e ) )
        {
            resizing = true;
        }
        prevX = e.getXOnScreen ();
        prevY = e.getYOnScreen ();
    }

    public void mouseDragged ( MouseEvent e )
    {
        if ( prevX != -1 && prevY != -1 && resizing )
        {
            Window w = SwingUtilities.getWindowAncestor ( e.getComponent () );
            Rectangle rect = w.getBounds ();

            Dimension dim;
            boolean undecorated;
            if ( w instanceof JDialog )
            {
                dim = ( ( JDialog ) w ).getContentPane ().getPreferredSize ();
                undecorated = ( ( JDialog ) w ).isUndecorated ();
            }
            else if ( w instanceof JFrame )
            {
                dim = ( ( JFrame ) w ).getContentPane ().getPreferredSize ();
                undecorated = ( ( JFrame ) w ).isUndecorated ();
            }
            else
            {
                dim = w.getPreferredSize ();
                undecorated = true;
            }

            // Checking for minimal width and height
            int xInc = e.getXOnScreen () - prevX;
            int yInc = e.getYOnScreen () - prevY;
            if ( undecorated )
            {
                if ( resizeSide == SwingConstants.NORTH_WEST || resizeSide == SwingConstants.WEST ||
                        resizeSide == SwingConstants.SOUTH_WEST )
                {
                    if ( rect.width - xInc < dim.width )
                    {
                        xInc = 0;
                    }
                }
                else if ( resizeSide == SwingConstants.NORTH_EAST ||
                        resizeSide == SwingConstants.EAST ||
                        resizeSide == SwingConstants.SOUTH_EAST )
                {
                    if ( rect.width + xInc < dim.width )
                    {
                        xInc = 0;
                    }
                }
                if ( resizeSide == SwingConstants.NORTH_WEST ||
                        resizeSide == SwingConstants.NORTH ||
                        resizeSide == SwingConstants.NORTH_EAST )
                {
                    if ( rect.height - yInc < dim.height )
                    {
                        yInc = 0;
                    }
                }
                else if ( resizeSide == SwingConstants.SOUTH_WEST ||
                        resizeSide == SwingConstants.SOUTH ||
                        resizeSide == SwingConstants.SOUTH_EAST )
                {
                    if ( rect.height + yInc < dim.height )
                    {
                        yInc = 0;
                    }
                }
            }

            // Resizing window if any changes are done
            if ( xInc != 0 || yInc != 0 )
            {
                if ( resizeSide == SwingConstants.NORTH_WEST )
                {
                    w.setBounds ( rect.x + xInc, rect.y + yInc, rect.width - xInc,
                            rect.height - yInc );
                }
                else if ( resizeSide == SwingConstants.NORTH )
                {
                    w.setBounds ( rect.x, rect.y + yInc, rect.width, rect.height - yInc );
                }
                else if ( resizeSide == SwingConstants.NORTH_EAST )
                {
                    w.setBounds ( rect.x, rect.y + yInc, rect.width + xInc, rect.height - yInc );
                }
                else if ( resizeSide == SwingConstants.WEST )
                {
                    w.setBounds ( rect.x + xInc, rect.y, rect.width - xInc, rect.height );
                }
                else if ( resizeSide == SwingConstants.EAST )
                {
                    w.setBounds ( rect.x, rect.y, rect.width + xInc, rect.height );
                }
                else if ( resizeSide == SwingConstants.SOUTH_WEST )
                {
                    w.setBounds ( rect.x + xInc, rect.y, rect.width - xInc, rect.height + yInc );
                }
                else if ( resizeSide == SwingConstants.SOUTH )
                {
                    w.setBounds ( rect.x, rect.y, rect.width, rect.height + yInc );
                }
                else if ( resizeSide == SwingConstants.SOUTH_EAST )
                {
                    w.setBounds ( rect.x, rect.y, rect.width + xInc, rect.height + yInc );
                }
                prevX = e.getXOnScreen ();
                prevY = e.getYOnScreen ();
            }
        }
    }

    public void mouseReleased ( MouseEvent e )
    {
        resizing = false;
    }
}

「インストール」メソッドを使用して、ウィンドウのサイズ変更動作を任意のコンポーネントに追加するだけです。resizeSide 変数は、ウィンドウのどちら側のサイズを変更する必要があるかを定義するために使用されます (たとえば、SwingConstants.SOUTH_EAST は、ウィンドウの右下隅のサイズをコンポーネントに強制的に変更させます)。

編集:特定のケースのコードを変更して、ドラッグ (サイズ変更) がコンポーネントの特定の領域からのみ開始されるようにすることもできます。これを行うには、mousePressed メソッドを変更するだけです。

于 2012-09-17T09:05:17.557 に答える
2

jFrame で同様のことを行いました。jFrame の外側に 4 つの非常に薄いボタンを追加することで回避し、ボタンから mousepressed および mousedragged リスナーを使用して jFrame のサイズ変更を制御しました。かなりスムーズに機能しました。

mousePressed リスナーを使用すると開始位置を取得できるため、フレームがドラッグ/サイズ変更される距離を計算できます

リソースを節約したい場合は、マウスがドラッグされたときではなく、マウスが離されたときにすべての子コンポーネントのサイズを変更する必要があります

編集: X 軸でフレームのサイズを変更する例。

public class NewJFrame extends javax.swing.JFrame
{
    //demo locations
    int X1 = 0;
    int X2 = 0;

    public NewJFrame()
    {
    initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {

        ResizeEast = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setUndecorated(true);

        ResizeEast.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                ResizeEastMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                ResizeEastMouseReleased(evt);
            }
        });
        ResizeEast.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                ResizeEastMouseDragged(evt);
            }
        });

        jButton1.setText("Close");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 320, Short.MAX_VALUE)
                .addComponent(ResizeEast, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addContainerGap(266, Short.MAX_VALUE))
            .addComponent(ResizeEast, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
        );

        pack();
    }

    private void ResizeEastMousePressed(java.awt.event.MouseEvent evt)
    {
    //set mosuepressed location to X1 and Y1
    X1 = evt.getX();
    }

    private void ResizeEastMouseReleased(java.awt.event.MouseEvent evt)
    {
    //update the location and size of all child components
    }

    private void ResizeEastMouseDragged(java.awt.event.MouseEvent evt)
    {
    //resize jframe on the fly
    X2 = evt.getX();
    //set minimum size to 100 wide
    if ((getWidth() - (X1 - X2)) < 100)
    {
        X2 = X1;
    }

    //resize east side only
    this.setSize(getWidth() - (X1 - X2), getHeight());
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    {
    System.exit(0);
    }

    public static void main(String args[])
    {
    java.awt.EventQueue.invokeLater(new Runnable()
    {
        public void run()
        {
        new NewJFrame().setVisible(true);
        }
    });
    }
    // Variables
    private javax.swing.JButton ResizeEast;
    private javax.swing.JButton jButton1;
}

コーナーからサイズ変更するには、次のように X と Y のサイズを変更する小さなコーナー ボタンを作成します。YourFrame.setSize(getWidth() - (X1 - X2), getHeight() - (Y1 - Y2));

于 2012-09-16T22:32:35.157 に答える