• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マウスイベントに合わせた動作を行いたい。)

マウスイベントに合わせた動作を行いたい。

このQ&Aのポイント
  • マウスイベントに合わせた動作を行いたい。
  • 枠上か否かの判別はできるようになったが、動作が不安定であり、意図した動作にならず困っている。
  • 枠上だと判定した場合にはボーダーサイズを変更し、枠の内部と判定した場合にはボーダーを含んだパネルをドラッグの動きに合わせて移動したい。どこを修正すればいいのかわからない。

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

> 全角スペースは使用してないので おっとっと、それは私の投稿のことです。 行のインデント(段下げ)のために全角スペースを利用しています。

Zepetto
質問者

お礼

本題に戻りまして 協力ありがとうございました。 一部を参考にさせていただいて補足欄のようになりました。 コントロール名はちょっと変更しちゃってます。 パネルの四隅の部分の場合のコードは追加が必要ですが。 あと仰られた通り、インセットの範囲が狭いので モードを持たせるかインセットの範囲を広くする(出来る?)かで 対応したいと思っています。 ありがとうございました。

Zepetto
質問者

補足

全角スペースの件、了解しました。 jPnlPower.addMouseMotionListener(new java.awt.event.MouseMotionListener() {  public void mouseDragged(java.awt.event.MouseEvent e) {   newX = e.getX();   newY = e.getY();   dX = newX - oldX;   dY = newY - oldY;   inner = jBdrPower.getBorderInsets(jPnlPower);   pBounds = jPnlPower.getBounds();   int xL = pBounds.x;   int xW = pBounds.width;   int yT = pBounds.y;   int yH = pBounds.height;   if( newX < inner.left )   { // Left Line Risize    jPnlPower.setBounds(new Rectangle( xL + dX, yT, xW - dX, yH ));    jBtnPowerOn.setBounds(new Rectangle(15, 20, ((xW-dX)-40)/2, yH-40));    jBtnPowerOff.setBounds(new Rectangle(((xW-dX)-40)/2+25, 20, ((xW-dX)-40)/2, yH-40));   }   else if( newX > xW - inner.right )   { // Right Line Risize    jPnlPower.setSize(newX, yH);    jBtnPowerOn.setBounds(new Rectangle(15, 20, (newX-40)/2, yH-40));    jBtnPowerOff.setBounds(new Rectangle((newX-40)/2+25, 20, (newX-40)/2, yH-40));   }   else if( newY < inner.top )   { // Top Line Risize    jPnlPower.setBounds(new Rectangle( xL, yT + dY, xW, yH - dY ));    jBtnPowerOn.setBounds(new Rectangle(15, 20, (xW-40)/2, (yH-dY)-40));    jBtnPowerOff.setBounds(new Rectangle((xW-40)/2+25, 20, (xW-40)/2, (yH-dY)-40));   }   else if( newY > yH - inner.bottom )   { // Bottom Line Risize    jPnlPower.setSize(xW, newY);    jBtnPowerOn.setBounds(new Rectangle(15, 20, (xW-40)/2, newY-40));    jBtnPowerOff.setBounds(new Rectangle((xW-40)/2+25, 20, (xW-40)/2, newY-40));   }   else{ // border の内側線よりも内:移動    jPnlPower.setLocation(xL + dX, yT + dY);   }  }  public void mouseMoved(java.awt.event.MouseEvent e) {  } }); jPnlPower.addMouseListener(new java.awt.event.MouseListener() {  public void mouseClicked(java.awt.event.MouseEvent e) {}  public void mouseEntered(java.awt.event.MouseEvent e) {}  public void mouseExited(java.awt.event.MouseEvent e) {}  public void mousePressed(java.awt.event.MouseEvent e) {   oldX = newX = e.getX();   oldY = newY = e.getY();  }  public void mouseReleased(java.awt.event.MouseEvent e) {} });

その他の回答 (2)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

> if( newX < inner.left ) > else if( newX > xW - inner.right ) > else if( newY < inner.top ) > else if( newY > yH - inner.bottom ) ここらは、間違いですよ。これらの比較式の左辺は座標値ですが、右辺は座標値ではありません。 mouseDragged()の冒頭で、oldX, oldYを更新してください。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

これはまだ、100%完成ではないようですが、まあ、ここらあたりを参考にしてください。(非常に細いInsetsの中をmouseDragged()で判断するのが無理なよう。サイズ変更はmousePressed()のときの位置--BorderのInsetsの中か?--で決定したほうが、確実にできると思います。現状では、サイズ変更は、できる場合とできない場合があります…マウスの微妙な動きの違いで。) --------------------------------------------------- 全角スペースを半角スペース2個に変えてください: import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; public class SampleButtonSize extends JFrame {  private static final long serialVersionUID = 1L;  private JPanel jContentPane = null;  private JPanel jPanel = null;  private TitledBorder jBdrPower = null;  private JButton jButton = null;  private JButton jButton1 = null;  Insets inner;  Rectangle pBounds;  int oldX, oldY, newX, newY, dX, dY, newBx, newBy, newBw, newBh;  private JPanel getJPanel() {   if (jPanel == null) {    jPanel = new JPanel();    jPanel.setLayout(null);    jPanel.setBounds(new Rectangle(30, 25, 205, 98));    jBdrPower = new TitledBorder(new EtchedBorder(), "Power");    jPanel.setBorder(jBdrPower);    jPanel.add(getJButton(), null);    jPanel.add(getJButton1(), null);    jPanel.addMouseMotionListener(new MouseMotionListener() {     public void mouseDragged(java.awt.event.MouseEvent e) {      oldX = newX; oldY = newY;      newX = e.getX();      newY = e.getY();      dX = newX - oldX;      dY = newY - oldY;      pBounds = jPanel.getBounds();      int xL = pBounds.x;      int xW = pBounds.width;      int yT = pBounds.y;      int yH = pBounds.height;      Rectangle pInner = jBdrPower.getInteriorRectangle       (jPanel, pBounds.x, pBounds.y, pBounds.width, pBounds.height);      if (newX < pInner.x       || newX > (pInner.x + pInner.width)       || newY < pInner.y       || newY > (pInner.y + pInner.height)){       newBx = (newX < pInner.x) ? newX : xL;       newBy = (newY < pInner.y) ? newY : yT;       newBw = (newX > (pInner.x + pInner.width)) ? newX - xL : xW;       newBh = (newY > (pInner.y + pInner.height)) ? newY - yT : yH;        // border の内側線よりも外:サイズ変更       jPanel.setBounds(newBx, newBy, newBw, newBh);      }      else{ // border の内側線よりも内:移動       jPanel.setLocation(xL + dX, yT + dY);      } //     jPanel.revalidate(); // 要らないみたい     }     public void mouseMoved(java.awt.event.MouseEvent e) {     }    });    jPanel.addMouseListener(new MouseAdapter(){     public void mousePressed(MouseEvent e){      oldX = newX = e.getX();      oldY = newY = e.getY();     }    });   } // if (jPanel == null)   return jPanel;  }  private JButton getJButton() {   if (jButton == null) {    jButton = new JButton();    jButton.setBounds(new Rectangle(16, 25, 82, 58));   }   return jButton;  }  private JButton getJButton1() {   if (jButton1 == null) {    jButton1 = new JButton();    jButton1.setBounds(new Rectangle(115, 24, 77, 59));   }   return jButton1;  }  public static void main(String[] args) {   SwingUtilities.invokeLater(new Runnable() {    public void run() {     SampleButtonSize thisClass = new SampleButtonSize();     thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     thisClass.setVisible(true);    }   });  }  public SampleButtonSize() {   super();   initialize();  }  private void initialize() {   this.setSize(300, 200);   this.setContentPane(getJContentPane());   this.setTitle("JFrame");  }  private JPanel getJContentPane() {   if (jContentPane == null) {    jContentPane = new JPanel();    jContentPane.setLayout(null);    jContentPane.add(getJPanel(), null);   }   return jContentPane;  } } ---------------------------------------

Zepetto
質問者

補足

ありがとうございます。 今から調べて実装してみます。 全角スペースは使用してないので タブを半角スペースにしたらいいのかな? 次回から気をつけます(汗)

関連するQ&A