Свернуть заголовок в TitledBorder

У меня TitledBorder заголовок больше, чем тело. Его урезают, и длина устанавливается в соответствии с максимальной длиной тела.

Предположим, у меня есть метка в теле, говорящая TEST, и она заключена в TitledBorder с заголовком TESTING TITLE. В этом случае заголовок урезается и отображается как TESTI

Использую для тела MigLayout.

Есть ли способ показать полное название независимо от содержания, которое он содержит?


person Rites    schedule 21.04.2011    source источник


Ответы (3)


Borders не участвуют напрямую в оценке размера LayoutManager (они сами не JComponent, а просто украшения вокруг JComponent).

Следовательно, единственный способ гарантировать, что заголовок в TitledBorder полностью виден, - это указать минимальный размер для панели, которой он назначен (или, скорее, для компонентов, встроенных в эту панель).

Расчет минимального размера в этом случае должен основываться на текущем заголовке вашего TitledBorder и Font, используемом TitledBorder для рисования его заголовка.

Если честно, не уверен, стоит ли писать всю эту работу.

Основываясь на точных компонентах, содержащихся в вашем TitledBorder, более простым решением было бы использовать JTextField.setColumns(n), где n достаточно велико по сравнению с заголовком.

На самом деле, лучшим способом было бы вообще избежать TitledBorder, как предложил Карстен Ленцч из JGoodies, и заменить его с цветным JLabel и горизонтальным JSeparator, которые будут полностью участвовать в макете и, следовательно, использоваться для вычисления размера.

person jfpoilpret    schedule 21.04.2011
comment
Я согласен с тобой, но кто знает, может быть, есть способ получше - person Rites; 21.04.2011
comment
Да, вы правы, см. Мою правку, рекомендуемый способ группировки компонентов на панели - использовать JLabel и JSeparator, а не TitledBorder. - person jfpoilpret; 21.04.2011
comment
Согласен, но я вынужден использовать границу. В любом случае, спасибо за такую ​​полезную информацию и идею :) - person Rites; 21.04.2011

Я обнаружил, что добавление горизонтальной стойки соответствующей ширины заставит панель изменить размер так, чтобы на ней отображался весь заголовок:

    myPanel.add(Box.createHorizontalStrut(desiredWidth));

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

person jlc    schedule 06.11.2012

У меня это хорошо работает:

 final String myPanelTitle = UIManager.getString("myPanel_title");
 final Border myPanelBorder = BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GREEN), myPanelTitle);
 JPanel myPanel = new JPanel(){
      @Override
      public Dimension getPreferredSize(){
           Dimension d = super.getPreferredSize();
           int insets = 2 * (myPanelBorder.getBorderInsets(this).left + myPanelBorder.getBorderInsets(this).right);
           double minWidth = this.getFontMetrics(this.getFont()).stringWidth(myPanelTitle) + insets;
           if(d.getWidth() > minWidth)
                 minWidth = d.getWidth();
           return new Dimension((int)minWidth, d.height);
       }
 };
 myPanel.setBorder(myPanelBorder);
person Richard    schedule 02.10.2016