- ベストアンサー
マウスイベントに合わせた動作を行いたい。
- マウスイベントに合わせた動作を行いたい。
- 枠上か否かの判別はできるようになったが、動作が不安定であり、意図した動作にならず困っている。
- 枠上だと判定した場合にはボーダーサイズを変更し、枠の内部と判定した場合にはボーダーを含んだパネルをドラッグの動きに合わせて移動したい。どこを修正すればいいのかわからない。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 全角スペースは使用してないので おっとっと、それは私の投稿のことです。 行のインデント(段下げ)のために全角スペースを利用しています。
その他の回答 (2)
- _ranco_
- ベストアンサー率58% (126/214)
> 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)
これはまだ、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; } } ---------------------------------------
補足
ありがとうございます。 今から調べて実装してみます。 全角スペースは使用してないので タブを半角スペースにしたらいいのかな? 次回から気をつけます(汗)
お礼
本題に戻りまして 協力ありがとうございました。 一部を参考にさせていただいて補足欄のようになりました。 コントロール名はちょっと変更しちゃってます。 パネルの四隅の部分の場合のコードは追加が必要ですが。 あと仰られた通り、インセットの範囲が狭いので モードを持たせるかインセットの範囲を広くする(出来る?)かで 対応したいと思っています。 ありがとうございました。
補足
全角スペースの件、了解しました。 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) {} });