コンポーネントの再描画
下記のサンプルソースに示したように、レイアウトマネジャーがnullの場合には
マウスドラッグでコンポーネントが再描画され、コンポーネントを移動可能なのですが、
スプリングレイアウトマネジャーを設定した同様なサンプルでは、再描画が
行われなくなります(移動はしていますが再描画されないため移動が見えません)。
スプリングレイアウトマネジャーを設定した場合には、フレームをリサイズすれば
再描画されるのですが(サンプルコード中のコメントをはずす)、repaint()等では
うまくいきません。
解決策をご存知の方がおられましたら、よろしくお願い申し上げます。
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SpringLayout;
public class MouseDraggeSample {
private static class NullLayoutSample extends JFrame {
public NullLayoutSample() {
setLayout( null );
JButton button = new JButton("Button");
button.setSize( 80, 30 );
button.setLocation( 100, 50 );
add( button );
DraggedMouseListener listener = new DraggedMouseListener();
button.addMouseListener( listener );
button.addMouseMotionListener( listener );
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize( 300, 200 );
setVisible( true );
}
private class DraggedMouseListener implements MouseListener, MouseMotionListener {
private Point p0;
public void mousePressed(MouseEvent e) {
p0 = e.getPoint();
}
public void mouseDragged(MouseEvent e) {
Component c = (Component)e.getSource();
c.setLocation( c.getX() + e.getX() - p0.x, c.getY() + e.getY() - p0.y );
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
}
}
private static class SpringLayoutSample extends JFrame {
public SpringLayoutSample() {
SpringLayout springLayout = new SpringLayout();
setLayout( springLayout );
JButton button = new JButton("Button");
button.setSize( 80, 30 );
springLayout.putConstraint( SpringLayout.WEST, button, 100, SpringLayout.WEST, this );
springLayout.putConstraint( SpringLayout.NORTH, button, 50, SpringLayout.NORTH, this );
add( button );
DraggedMouseListener listener = new DraggedMouseListener();
button.addMouseListener( listener );
button.addMouseMotionListener( listener );
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation( 300, 0 );
setSize( 300, 200 );
setVisible( true );
}
private class DraggedMouseListener implements MouseListener, MouseMotionListener {
private Point p0;
public void mousePressed(MouseEvent e) {
p0 = e.getPoint();
}
public void mouseDragged(MouseEvent e) {
Component c = (Component)e.getSource();
int x = c.getX() + e.getX() - p0.x;
int y = c.getY() + e.getY() - p0.y;
SpringLayout layout = (SpringLayout)getContentPane().getLayout();
layout.putConstraint( SpringLayout.WEST, c, x, SpringLayout.WEST, SpringLayoutSample.this );
layout.putConstraint( SpringLayout.NORTH, c, y, SpringLayout.NORTH, SpringLayoutSample.this );
// setSize( getWidth()+1, getHeight() ); // repaint()ではダメ
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
}
}
public static void main(String[] args) {
new NullLayoutSample();
new SpringLayoutSample();
}
}