I want a JPanel that can be Collapsed or Expanded when user clicks on a text/icon on its border. I need this type of panel due to space crunch in my application.
I read
not sure where you looked, but it's not that difficult to find - even given the infrastructure mess we are in ;-)
Go to the project home of SwingX, then follow the link in the first paragraph to the (barebone) download section, down to releases\1.6.2. Nothing special to the collapsibles themselves, just containers to put components into.
I think you can use a JSplitPane to tackle your problem. Utilizing the property to set the position of divider judiciously, you can achieve what you want.
So here comes a little class purely in Swing :) This implementation assumes the title to be top left...
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class JCollapsiblePanel extends JPanel {
private TitledBorder border;
private Dimension visibleSize;
private boolean collapsible;
public JCollapsiblePanel(String title, Color titleCol) {
super();
collapsible = true;
border = new TitledBorder(title);
border.setTitleColor(titleCol);
border.setBorder(new LineBorder(Color.white));
setBorder(border);
// as Titleborder has no access to the Label we fake the size data ;)
final JLabel l = new JLabel(title);
Dimension size = l.getPreferredSize();
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (!collapsible) {
return;
}
Insets i = getBorder().getBorderInsets(JCollapsiblePanel.this);
if (e.getX() < i.left + size.width && e.getY() < i.bottom + size.height) {
if (visibleSize == null || getHeight() > size.height) {
visibleSize = getSize();
}
if (getSize().height < visibleSize.height) {
setMaximumSize(new Dimension(visibleSize.width, 20000));
setMinimumSize(visibleSize);
} else {
setMaximumSize(new Dimension(visibleSize.width, size.height));
}
revalidate();
e.consume();
}
}
});
}
public void setCollapsible(boolean collapsible) {
this.collapsible = collapsible;
}
public void setTitle(String title) {
border.setTitle(title);
}
}