How to resize JPanel at Runtime ?
Hi,
Our Project me t a problem as below, we hope to resize JPanel at Runtime , not at design time, ie, when we first click the button called "Move JPanel" , then we click the JPanel, then we can drag it around within main panel, but we hope to resize the size of this JPanel when we point to the border of this JPanel then drag its border to zoom in or zoom out this JPanel.
Please advice how to do that?
Thanks in advance.
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Vector;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.*;
publicclass ResizeJPanelsextends JPanel
{
protected JLabel label1, label2, label3, label4, labeltmp;
protected JLabel[] labels;
protected JPanel[] panels;
protected JPanel selectedJPanel;
protected JButton btn =new JButton("Move JPanel");
int cx, cy;
protected Vector order =new Vector();
publicstaticvoid main(String[] args)
{
JFrame f =new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new ResizeJPanels().GroupJLabels());
f.setSize(600,700);
f.setLocation(200,200);
f.setVisible(true);
}
private MouseListener ml =new MouseAdapter(){
publicvoid mousePressed(MouseEvent e){
Point p = e.getPoint();
JPanel jp =new JPanel();
jp.setLayout(null);
Component[] c = ((JPanel)e.getSource()).getComponents();
System.out.println("c.length = " + c.length);
for(int j = 0; j < c.length; j++){
if(c[j].getBounds().contains(p)){
if(selectedJPanel !=null && selectedJPanel != (JPanel)c[j])
selectedJPanel.setBorder(BorderFactory.createEtchedBorder());
selectedJPanel = (JPanel)c[j];
selectedJPanel.setBorder(BorderFactory.createLineBorder(Color.green));
break;
}
add(jp);
revalidate();
}
}
};
public JPanel GroupJLabels ()
{
setLayout(null);
addLabels();
label1.setBounds( 125, 150, 125, 25);
label2.setBounds(425, 150, 125, 25);
label3.setBounds( 125, 575, 125, 25);
label4.setBounds(425, 575, 125, 25);
//add(btn);
btn.setBounds(10, 5, 205, 25);
add(btn);
determineCenterOfComponents();
ComponentMover mover =new ComponentMover();
ActionListener lst =new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
ComponentMover mover =new ComponentMover();
addMouseListener(mover);
addMouseMotionListener(mover);
}
};
btn.addActionListener(lst);
addMouseListener(ml);
returnthis;
}
publicvoid paintComponent(final Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Point[] p;
g2.setStroke(new BasicStroke(4f));
for(int i = 0 ; i < order.size()-1; i++){
JPanel l1 = (JPanel)order.elementAt(i);
JPanel l2 = (JPanel)order.elementAt(i+1);
p = getCenterPoints(l1, l2);
g2.setColor(Color.black);
// g2.draw(new Line2D.Double(p[0], p[1]));
}
}
private Point[] getCenterPoints(Component c1, Component c2)
{
Point
p1 =new Point(),
p2 =new Point();
Rectangle
r1 = c1.getBounds(),
r2 = c2.getBounds();
p1.x = r1.x + r1.width/2;
p1.y = r1.y + r1.height/2;
p2.x = r2.x + r2.width/2;
p2.y = r2.y + r2.height/2;
returnnew Point[]{p1, p2};
}
privatevoid determineCenterOfComponents()
{
int
xMin = Integer.MAX_VALUE,
yMin = Integer.MAX_VALUE,
xMax = 0,
yMax = 0;
for(int i = 0; i < labels.length; i++)
{
Rectangle r = labels[i].getBounds();
if(r.x < xMin)
xMin = r.x;
if(r.y < yMin)
yMin = r.y;
if(r.x + r.width > xMax)
xMax = r.x + r.width;
if(r.y + r.height > yMax)
yMax = r.y + r.height;
}
cx = xMin + (xMax - xMin)/2;
cy = yMin + (yMax - yMin)/2;
}
privateclass ComponentMoverextends MouseInputAdapter
{
Point offsetP =new Point();
boolean dragging;
publicvoid mousePressed(MouseEvent e)
{
Point p = e.getPoint();
for(int i = 0; i < panels.length; i++)
{
Rectangle r = panels[i].getBounds();
if(r.contains(p))
{
selectedJPanel = panels[i];
order.addElement(panels[i]);
offsetP.x = p.x - r.x;
offsetP.y = p.y - r.y;
dragging =true;
repaint();//added
break;
}
}
}
publicvoid mouseReleased(MouseEvent e)
{
dragging =false;
}
publicvoid mouseDragged(MouseEvent e)
{
if(dragging)
{
Rectangle r = selectedJPanel.getBounds();
r.x = e.getX() - offsetP.x;
r.y = e.getY() - offsetP.y;
selectedJPanel.setBounds(r.x, r.y, r.width, r.height);
//determineCenterOfComponents();
repaint();
}
}
}
privatevoid addLabels()
{
label1 =new JLabel("Label 1");
label2 =new JLabel("Label 2");
label3 =new JLabel("Label 3");
label4 =new JLabel("Label 4");
labels =new JLabel[]{
label1, label2, label3, label4
};
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.setLayout(new BorderLayout());
panels =new JPanel[]{jp};
jp.setBorder(new LineBorder(Color.black, 3,false));
jp.setPreferredSize(new Dimension(400,200));
jp.add(jl, BorderLayout.NORTH);
for(int i = 0; i < labels.length; i++)
{
labels[i].setHorizontalAlignment(SwingConstants.CENTER);
labels[i].setBorder(BorderFactory.createEtchedBorder());
jp.add(labels[i], BorderLayout.CENTER);
}
jp.setBounds(100, 100, 400,200);
add(jp);
}
}

