# 3
hi!
it seems to be a design error, i could not play much with it, but i could move it, so please check out your code, this will be highly possible. you need to understand mouse listener, and mouse motion listener. if you have added something in the parent doesnot means that you will get that event for its child. so please try to evaluate your code, it was gr8. read examples more carefully.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.AbstractBorder;
import javax.swing.border.LineBorder;
import javax.swing.event.MouseInputAdapter;
public class Resizing extends JPanel
{
public Resizing()
{
super(null);
JPanel jp = addPanel();
PanelControlAdapter control = new PanelControlAdapter(this);
jp.addMouseListener(control);
jp.addMouseMotionListener(control);
}
private JPanel addPanel()
{
JLabel jl = new JLabel("This is resizeable JPanel at Runtime");
jl.setBackground(Color.green);
jl.setOpaque(true);
jl.setFont(new Font("Helvetica", Font.BOLD, 18));
JPanel jp = new JPanel();
jp.setToolTipText("This is resizing inner Jpanel jp");
jp.setLayout(new BorderLayout());
jp.setBorder(new LineBorder(Color.black, 3, false));
jp.add(jl, BorderLayout.NORTH);
jp.setBounds(50, 50, 400, 200);
setToolTipText("This is resizing Outer Jpanel this");
add(jp);
return jp;
}
public static void main(String[] args)
{
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Resizing());
f.setSize(500, 400);
f.setLocation(100, 100);
f.setVisible(true);
}
}
class PanelControlAdapter extends MouseInputAdapter
{
ComponentselectedComponent;
LineBorderblack;
LineBordergreen;
Pointoffset= new Point();
Pointstart= new Point();
booleandragging= false;
booleanresizing= false;
public PanelControlAdapter(Resizing r)
{
//host = r;
black = new LineBorder(Color.black, 3, false);
green = new LineBorder(Color.green, 3, false);
}
static int io = 0;
public void mouseMoved(MouseEvent e)
{
Point l_pEventPoint = e.getPoint();
boolean hovering = false;
Component l_cSource = (Component)e.getSource(); //host.getComponent(0);
Rectangle l_rectCompSize = l_cSource.getBounds();
if (l_rectCompSize.contains(l_pEventPoint))
{
hovering = true;
if (selectedComponent != l_cSource)
{
if (selectedComponent != null) // reset
((JComponent) selectedComponent).setBorder(black);
selectedComponent = l_cSource;
((JComponent) selectedComponent).setBorder(green);
}
if (overBorder(l_pEventPoint))
setCursor(l_pEventPoint);
else if (selectedComponent.getCursor() != Cursor.getDefaultCursor())
selectedComponent.setCursor(Cursor.getDefaultCursor());
}
if (!hovering && selectedComponent != null)
{
((JComponent) selectedComponent).setBorder(black);
selectedComponent = null;
}
}
private boolean overBorder(Point p)
{
Rectangle r = selectedComponent.getBounds();
JComponent target = (JComponent) selectedComponent;
Insets insets = target.getBorder().getBorderInsets(target);
// Assume uniform border insets.
r.grow(-insets.left, -insets.top);
return r.contains(p);
}
private void setCursor(Point p)
{
JComponent target = (JComponent) selectedComponent;
AbstractBorder border = (AbstractBorder) target.getBorder();
Rectangle r = target.getBounds();
Rectangle ir = border.getInteriorRectangle(target, r.x, r.y, r.width,
r.height);
int outcode = ir.outcode(p.x, p.y);
Cursor cursor;
switch (outcode)
{
case Rectangle.OUT_TOP:
cursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
break;
case Rectangle.OUT_TOP + Rectangle.OUT_LEFT:
cursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
break;
case Rectangle.OUT_LEFT:
cursor = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
break;
case Rectangle.OUT_LEFT + Rectangle.OUT_BOTTOM:
cursor = Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);
break;
case Rectangle.OUT_BOTTOM:
cursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
break;
case Rectangle.OUT_BOTTOM + Rectangle.OUT_RIGHT:
cursor = Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);
break;
case Rectangle.OUT_RIGHT:
cursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
break;
case Rectangle.OUT_RIGHT + Rectangle.OUT_TOP:
cursor = Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);
break;
default:
cursor = Cursor.getDefaultCursor();
}
selectedComponent.setCursor(cursor);
}
public void mousePressed(MouseEvent e)
{
Point p = e.getPoint();
if (selectedComponent != null)
{
Rectangle r = selectedComponent.getBounds();
if (selectedComponent.getCursor() == Cursor.getDefaultCursor())
{
offset.x = p.x - r.x;
offset.y = p.y - r.y;
dragging = true;
} else
{
start = p;
resizing = true;
}
}
}
public void mouseReleased(MouseEvent e)
{
dragging = false;
resizing = false;
}
public void mouseDragged(MouseEvent e)
{
Point p = e.getPoint();
if (dragging || resizing)
{
Rectangle r = selectedComponent.getBounds();
if (dragging)
{
r.x = p.x - offset.x;
r.y = p.y - offset.y;
selectedComponent.setLocation(r.x, r.y);
} else if (resizing)
{
int type = selectedComponent.getCursor().getType();
switch (type)
{
case Cursor.N_RESIZE_CURSOR:
r.height -= p.y - start.y;
r.y = p.y;
break;
case Cursor.NW_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
r.height -= p.y - start.y;
r.y = p.y;
break;
case Cursor.W_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
break;
case Cursor.SW_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
r.height += p.y - start.y;
break;
case Cursor.S_RESIZE_CURSOR:
r.height += p.y - start.y;
break;
case Cursor.SE_RESIZE_CURSOR:
r.width += p.x - start.x;
r.height += p.y - start.y;
break;
case Cursor.E_RESIZE_CURSOR:
r.width += p.x - start.x;
break;
case Cursor.NE_RESIZE_CURSOR:
r.width += p.x - start.x;
r.height -= p.y - start.y;
r.y = p.y;
break;
default:
System.out.println("Unexpected resize type: " + type);
}
selectedComponent.setBounds(r.x, r.y, r.width, r.height);
start = p;
}
}
}
}
regards
Aniruddha
# 4
Thanks, sir, your code is very good, but I change to following,
Then if I add all setToolTipText, then all JPanel and JLabel cannot be moved, If I remove these setToolTipText, then I can move freely, what is wrong here?
Thanks, really appreciated
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.MouseInputAdapter;
public class DNDJPanelJLabel extends JPanel {
public DNDJPanelJLabel() {
super(null);
addPanel();
PanelControlAdapter control = new PanelControlAdapter(this);
addMouseListener(control);
addMouseMotionListener(control);
}
private void addPanel() {
JLabel jl = new JLabel("This is resizeable JPanel at Runtime");
JLabel jl1 = new JLabel("This is DnD JLabel at Runtime");
jl.setBackground(Color.green);
jl1.setBackground(Color.gray);
jl.setToolTipText("This is resizing inner JLabel Jl");
jl.setOpaque(true);
jl1.setOpaque(true);
jl.setFont(new Font("Helvetica", Font.BOLD, 18));
jl1.setFont(new Font("Helvetica", Font.BOLD, 12));
jl1.setBounds(100, 300,250,60);
jl1.setToolTipText("This is resizing inner Jpanel jp");
JPanel jp = new JPanel();
//jp.setToolTipText("*****************************");
jp.setLayout(new BorderLayout());
jp.setToolTipText("This is resizing inner Jpanel jp");
jp.setBorder(new LineBorder(Color.black, 3, false));
jp.add(jl, BorderLayout.NORTH);
jp.setBounds(50,50,400,200);
add(jp);
add(jl1);
}
public static void main(String[] args) {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new DNDJPanelJLabel());
f.setSize(500,400);
f.setLocation(100,100);
f.setVisible(true);
}
}
class PanelControlAdapter extends MouseInputAdapter {
DNDJPanelJLabel host;
Component selectedComponent;
LineBorder black;
LineBorder green;
Point offset = new Point();
Point start = new Point();
boolean dragging = false;
boolean resizing = false;
public PanelControlAdapter(DNDJPanelJLabel r) {
host = r;
black = new LineBorder(Color.black, 3, false);
green = new LineBorder(Color.green, 3, false);
}
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
boolean hovering = false;
Component[] c = {host.getComponent(0),host.getComponent(1)};
for(int i=0; i<c.length;i++){
Rectangle r = c[i].getBounds();
if(r.contains(p)) {
hovering = true;
if(selectedComponent != c[i]) {
if(selectedComponent != null) // reset
((JComponent)selectedComponent).setBorder(black);
selectedComponent = c[i];
((JComponent)selectedComponent).setBorder(green);
}
if(overBorder(p))
setCursor(p);
else if(selectedComponent.getCursor() != Cursor.getDefaultCursor())
selectedComponent.setCursor(Cursor.getDefaultCursor());
}
if(!hovering && selectedComponent != null) {
((JComponent)selectedComponent).setBorder(black);
selectedComponent = null;
}
}
}
private boolean overBorder(Point p) {
Rectangle r = selectedComponent.getBounds();
JComponent target = (JComponent)selectedComponent;
Insets insets = target.getBorder().getBorderInsets(target);
// Assume uniform border insets.
r.grow(-insets.left, -insets.top);
return !r.contains(p);
}
private void setCursor(Point p) {
JComponent target = (JComponent)selectedComponent;
AbstractBorder border = (AbstractBorder)target.getBorder();
Rectangle r = target.getBounds();
Rectangle ir = border.getInteriorRectangle(target, r.x, r.y, r.width, r.height);
int outcode = ir.outcode(p.x, p.y);
Cursor cursor;
switch(outcode) {
case Rectangle.OUT_TOP:
cursor = Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR);
break;
case Rectangle.OUT_TOP + Rectangle.OUT_LEFT:
cursor = Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR);
break;
case Rectangle.OUT_LEFT:
cursor = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
break;
case Rectangle.OUT_LEFT + Rectangle.OUT_BOTTOM:
cursor = Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR);
break;
case Rectangle.OUT_BOTTOM:
cursor = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
break;
case Rectangle.OUT_BOTTOM + Rectangle.OUT_RIGHT:
cursor = Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR);
break;
case Rectangle.OUT_RIGHT:
cursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
break;
case Rectangle.OUT_RIGHT + Rectangle.OUT_TOP:
cursor = Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR);
break;
default:
cursor = Cursor.getDefaultCursor();
}
selectedComponent.setCursor(cursor);
}
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
if(selectedComponent != null) {
Rectangle r = selectedComponent.getBounds();
if(selectedComponent.getCursor() == Cursor.getDefaultCursor()) {
offset.x = p.x - r.x;
offset.y = p.y - r.y;
dragging = true;
} else {
start = p;
resizing = true;
}
}
}
public void mouseReleased(MouseEvent e) {
dragging = false;
resizing = false;
}
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
if(dragging || resizing) {
Rectangle r = selectedComponent.getBounds();
if(dragging) {
r.x = p.x - offset.x;
r.y = p.y - offset.y;
selectedComponent.setLocation(r.x, r.y);
} else if(resizing) {
int type = selectedComponent.getCursor().getType();
switch(type) {
case Cursor.N_RESIZE_CURSOR:
r.height -= p.y - start.y;
r.y = p.y;
break;
case Cursor.NW_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
r.height -= p.y - start.y;
r.y = p.y;
break;
case Cursor.W_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
break;
case Cursor.SW_RESIZE_CURSOR:
r.width -= p.x - start.x;
r.x = p.x;
r.height += p.y - start.y;
break;
case Cursor.S_RESIZE_CURSOR:
r.height += p.y - start.y;
break;
case Cursor.SE_RESIZE_CURSOR:
r.width += p.x - start.x;
r.height += p.y - start.y;
break;
case Cursor.E_RESIZE_CURSOR:
r.width += p.x - start.x;
break;
case Cursor.NE_RESIZE_CURSOR:
r.width += p.x - start.x;
r.height -= p.y - start.y;
r.y = p.y;
break;
default:
System.out.println("Unexpected resize type: " + type);
}
selectedComponent.setBounds(r.x, r.y, r.width, r.height);
start = p;
}
}
}
}
>