Как получить разборный / расширяемый JPanel в Java Swing - PullRequest
10 голосов
/ 18 ноября 2011

Я хочу JPanel, который может быть свернут или расширен, когда пользователь нажимает на текст / значок на его границе.Мне нужен этот тип панели из-за нехватки места в моем приложении.

Я читал о классе CollapsiblePanel, но не уверен, как его использовать .. Я думаю, что SwingX необходимо загрузить, но я не нашел его нигде.

Более того, было бы лучше, если бы я получилРешение этой проблемы в базовом Java Swing.

Ответы [ 3 ]

11 голосов
/ 18 ноября 2011

не уверен, где вы смотрели, но не , что трудно найти - даже учитывая беспорядок инфраструктуры, в котором мы находимся ;-)

Перейдите на главную страницу проекта SwingX , затем перейдите по ссылке в первом абзаце на раздел загрузки (barebone), вплоть до релизов \ 1.6.2. Ничего особенного для самих складных элементов, только контейнеры для размещения компонентов.

1 голос
/ 18 ноября 2011

Я думаю, вы можете использовать JSplitPane для решения вашей проблемы.Используя свойство, чтобы разумно установить положение делителя, вы можете достичь того, чего хотите.

0 голосов
/ 23 октября 2018

Итак, небольшой класс по Swing. Эта реализация предполагает, что заголовок находится слева вверху ...

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);
  }
}
...