マウスでコンポーネントのサイズを変更する方法
ウインドウの脇にリストを表示するSwingアプリを作っていますが、幅が狭いと文字が切れ、広いと画面が狭くなるので、
マウスで幅を調整できるようにプログラムを修正しました。
ネットで検索したけど参考になるページが見つからなかったので、変更方法の解説ページを作りました。参考にされてください。
マウスでパネルの幅を変える
フレーム(SwingTest3)にパネル(panel)を左(WEST)に置いたシンプルなプログラムで説明します。
左の白い部分を広げたり狭くしたりするのをマウスを使って実現します。
マウスを使うので、マウスイベントを使います。
イベントを利用するのは2つ。
①マウスがパネルの右端に移動したら、マウスカーソルを変更して、幅が変更できることを表示する。
②その位置でマウスをドラッグすると、ドラッグした位置までパネルの幅を広げる。
具体的な方法
①panel上でマウスが移動したら、mouseMovedのイベントを発生させる。
panel上のマウスのx位置とパネルの幅を比較して、マウスが右端に位置していれば、
マウスの形状を変更する。変更フラグをtrueにセットする。
public void mouseMoved(MouseEvent e){
//マウスの位置が要素パネルの右際であれば、habaflugをtrueに設定してマウスカーソルの形状を横両矢印にする
int x = e.getX();
int w = SwingTest3.this.panel.getWidth() - 5;
//System.out.println(x+" "+w);
SwingTest3.this.habaflug = false;
e.getComponent().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) );
if( x>w ){
e.getComponent().setCursor( new Cursor(Cursor.E_RESIZE_CURSOR) );
SwingTest3.this.habaflug = true;
}
}
②panel上でマウスがドラッグされたら、mouseDraggedのイベントを発生させる。
変更フラグがtrueならマウスの位置までパネルを広げて、repaintする。
//habaflugがtureの時にマウスがドラッグされたら、パネルの幅を変更する
public void mouseDragged(MouseEvent e){
if( SwingTest3.this.habaflug ){
int x = e.getX();
//System.out.println("動いた "+x);
//要素パネルの幅を変える
SwingTest3.this.panel.setPreferredSize( new Dimension(x, SwingTest3.this.panel.getHeight() ) );
SwingTest3.this.panel.revalidate();
//再描画
SwingTest3.this.repaint();
SwingTest3.this.revalidate();
}
}
プログラムのソース
全体は以下のようになります。
revalidate()を入れるのがコツ、というか、ここで引っかかるかと思います。
import javax.swing.Jframe;
import javax.swing.Jpanel;
import tomojavalib.p2cad.Frame;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* マウスでパネルの幅を変更するclass
*/
public class SwingTest3 extends Jframe {
//幅変更の許可フラグ
private boolean habaflug = false;
//幅を変更するパネル
private Jpanel panel = null;
/*コンストラクタ*/
public SwingTest3()
{
//サイズ設定
this.setBounds(50, 50, 400, 400);
//パネル設定
panel = new Jpanel();
panel.setBackground(Color.WHITE);
panel.setPreferredSize( new Dimension( 110,100 ) );
//パネルの設置
add( panel , BorderLayout.WEST );
//イベントの設定
this.setEvent();
}
/**
* パネルの幅を調整するためのイベントを設定します
*/
private void setEvent()
{
this.panel.addMouseMotionListener(
new MouseAdapter(){
public void mouseMoved(MouseEvent e){
//マウスの位置が要素パネルの右際であれば、habaflugをtrueに設定してマウスカーソルの形状を横両矢印にする
int x = e.getX();
int w = SwingTest3.this.panel.getWidth() - 5;
//System.out.println(x+" "+w);
SwingTest3.this.habaflug = false;
e.getComponent().setCursor( new Cursor(Cursor.DEFAULT_CURSOR) );
if( x>w ){
e.getComponent().setCursor( new Cursor(Cursor.E_RESIZE_CURSOR) );
SwingTest3.this.habaflug = true;
}
}
//habaflugがtureの時にマウスがドラッグされたら、パネルの幅を変更する
public void mouseDragged(MouseEvent e){
if( SwingTest3.this.habaflug ){
int x = e.getX();
//System.out.println("動いた "+x);
//要素パネルの幅を変える
SwingTest3.this.panel.setPreferredSize( new Dimension(x, SwingTest3.this.panel.getHeight() ) );
SwingTest3.this.panel.revalidate();
//再描画
SwingTest3.this.repaint();
SwingTest3.this.revalidate();
}
}
});
}
最終更新日: 2018-12-21 08:53:57