import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ChangeSizePanel extends JPanel implements ComponentListener,
MouseListener, MouseMotionListener
{
// Attribute
private JComponent child = null;
private int dragMode = 0;
private int dragX = 0;
private int dragY = 0;
// Konstruktor
public ChangeSizePanel()
{
addComponentListener(this);
addMouseListener(this);
addMouseMotionListener(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
child.paint(g);
// Rahmen zeichnen
g.setColor(new Color(100, 100, 100));
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
// Kasten oben links
g.setColor(dragMode == 1 ? Color.red : Color.black);
g.fillRect(0, 0, 5, 5);
// Kasten oben mitte
g.setColor(dragMode == 2 ? Color.red : Color.black);
g.fillRect(getSize().width / 2 - 3, 0, 5, 5);
// Kasten oben rechts
g.setColor(dragMode == 3 ? Color.red : Color.black);
g.fillRect(getSize().width - 6, 0, 5, 5);
// Kasten mitte links
g.setColor(dragMode == 4 ? Color.red : Color.black);
g.fillRect(0, getSize().height / 2 - 3, 5, 5);
// Kasten mitte rechts
g.setColor(dragMode == 5 ? Color.red : Color.black);
g.fillRect(getSize().width - 6, getSize().height / 2 - 3, 5, 5);
// Kasten unten links
g.setColor(dragMode == 6 ? Color.red : Color.black);
g.fillRect(0, getSize().height - 6, 5, 5);
// Kasten unten mitte
g.setColor(dragMode == 7 ? Color.red : Color.black);
g.fillRect(getSize().width / 2 - 3, getSize().height - 6, 5, 5);
// Kasten unten rechts
g.setColor(dragMode == 8 ? Color.red : Color.black);
g.fillRect(getSize().width - 6, getSize().height - 6, 5, 5);
}
// fügt zu einer Komponente einen Rahmen hinzu
public void addChild(JComponent child)
{
this.child = child;
Rectangle r = child.getBounds();
Container c = child.getParent();
c.remove(child);
c.add(this);
setBounds(r);
}
// läßt den Rahmen um die Komponente verschwinden
public void releaseChild()
{
Rectangle r = getBounds();
Container c = getParent();
c.remove(this);
c.add(child);
child.setBounds(r);
}
// ComponentListener-Methoden
public void componentResized(ComponentEvent arg0)
{
child.setBounds(0, 0, getSize().width, getSize().height);
repaint();
}
public void componentMoved(ComponentEvent arg0)
{
child.setBounds(0, 0, getSize().width, getSize().height);
repaint();
}
public void componentShown(ComponentEvent arg0)
{
}
public void componentHidden(ComponentEvent arg0)
{
}
// MouseListener- und MouseMotionListener-Methoden
public void mouseMoved(MouseEvent me)
{
int x = me.getX();
int y = me.getY();
int old = dragMode;
dragMode = 9;
int toleranz = 8;
if (x <= toleranz && y <= toleranz)
dragMode = 1;
if (x >= getSize().width / 2 - toleranz / 2
&& x <= getSize().width / 2 + toleranz / 2 && y <= toleranz)
dragMode = 2;
if (x >= getSize().width - toleranz && y <= toleranz)
dragMode = 3;
if (x <= toleranz && y >= getSize().height / 2 - toleranz / 2
&& y <= getSize().height / 2 + toleranz / 2)
dragMode = 4;
if (x >= getSize().width - toleranz
&& y >= getSize().height / 2 - toleranz / 2
&& y <= getSize().height / 2 + toleranz / 2)
dragMode = 5;
if (x <= toleranz && y >= getSize().height - toleranz)
dragMode = 6;
if (x >= getSize().width / 2 - toleranz / 2
&& x <= getSize().width / 2 + toleranz / 2
&& y >= getSize().height - toleranz)
dragMode = 7;
if (x >= getSize().width - toleranz && y >= getSize().height - toleranz)
dragMode = 8;
dragX = x;
dragY = y;
if (dragMode != old)
repaint();
}
public void mouseReleased(MouseEvent me)
{
dragMode = 0;
repaint();
}
public void mouseExited(MouseEvent me)
{
if (me.getModifiers() == 0)
{
dragMode = 0;
repaint();
}
}
public void mouseDragged(MouseEvent me)
{
int dx = me.getX() - dragX;
int dy = me.getY() - dragY;
dragX = me.getX();
dragY = me.getY();
int dleft = 0;
int dtop = 0;
int dwidth = 0;
int dheight = 0;
if (dragMode == 1)
{
dleft = dx;
dtop = dy;
dwidth = -dx;
dheight = -dy;
}
if (dragMode == 2)
{
dtop = dy;
dheight = -dy;
}
if (dragMode == 3)
{
dwidth = dx;
dtop = dy;
dheight = -dy;
}
if (dragMode == 4)
{
dleft = dx;
dwidth = -dx;
}
if (dragMode == 5)
{
dwidth = dx;
}
if (dragMode == 6)
{
dleft = dx;
dwidth = -dx;
dheight = dy;
}
if (dragMode == 7)
{
dheight = dy;
}
if (dragMode == 8)
{
dwidth = dx;
dheight = dy;
}
if (dragMode == 9)
{
dleft = dx;
dtop = dy;
}
Rectangle r = getBounds();
r.x += dleft;
r.y += dtop;
r.width += dwidth;
r.height += dheight;
setBounds(r);
dragX -= dleft;
dragY -= dtop;
}
public void mouseEntered(MouseEvent me)
{
}
public void mouseClicked(MouseEvent me)
{
if (me.getClickCount() == 2)
releaseChild();
}
public void mousePressed(MouseEvent me)
{
}
// Hauptmethode
public static void main(String[] args)
{
JFrame f = new JFrame("Komponenten können ihre Größe ändern!");
f.getContentPane().setLayout(null);
// JButton erzeugen
JButton b = new JButton("Hallo!");
b.setBounds(50, 50, 100, 100);
f.getContentPane().add(b);
// JTree erzeugen
JTree t = new JTree();
t.setBounds(300, 150, 150, 300);
f.getContentPane().add(t);
// zwei Rahmen erzeugen
new ChangeSizePanel().addChild(b);
new ChangeSizePanel().addChild(t);
f.setSize(500, 700);
f.setVisible(true);
}
}