Усечение заголовка в JPanel TitledBorder - Java swing - PullRequest
1 голос
/ 20 июня 2011

У меня есть JPanel с TitledBorder, но содержимое панели уже, чем заголовок на границе, и заголовок усекается. Я использую BoxLayout для JPanel, который, как показано здесь , обращает внимание на ручную настройку ширины. Я попытался установить минимальную, максимальную и предпочтительную ширину панели в соответствии с функцией getMinimumSize () TitledBorder вместе с шириной ее компонентов, но все они не работают. Единственное, что сработало, - это использование коробчатого наполнителя, но это привело к нежелательным отступам.

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

this.jpCases.setLayout(new javax.swing.BoxLayout(this.jpCases, javax.swing.BoxLayout.LINE_AXIS));
        List<Category> categories = db.getCategories();
        for (Category cat : categories) {
            JPanel jp = new JPanel();
            TitledBorder tb = BorderFactory.createTitledBorder(cat.getDescription());

            jp.setBorder(tb);
            jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS));
            jp.setAlignmentY(Component.TOP_ALIGNMENT);
            jp.setAlignmentX(Component.LEFT_ALIGNMENT);

            List<Case> cases = db.getCasesByCategoryId(cat.getId());
            for (Case c : cases) {
                JRadioButton jrbCase = new JRadioButton();
                jrbCase.setText(c.getDescription());
                jrbCase.setToolTipText(c.getText());
                jrbCase.setMaximumSize(tb.getMinimumSize(jp));
                bgCases.add(jrbCase);
                jp.add(jrbCase);
            }
        //jp.add(new Box.Filler(tb.getMinimumSize(jp), tb.getMinimumSize(jp), tb.getMinimumSize(jp)));
            this.jpCases.add(jp);
    }

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Как насчет расчета необходимой ширины:

       JRadioButton jrb = new JRadioButton();
       int width = (int) SwingUtilities2.getFontMetrics( jrb, jrb.getFont() ).getStringBounds( cat.getDescription(), null ).getWidth();
       for (Case c : cases) {
            JRadioButton jrbCase = new JRadioButton();
            jrbCase.setText(c.getDescription());
            jrbCase.setToolTipText(c.getText());
            jrbCase.setPreferredSize( new Dimension( width, jrbCase.getPreferredSize().height ) );
            bgCases.add(jrbCase);
            jp.add(jrbCase);
        }
0 голосов
/ 03 октября 2016

Это хорошо работает для меня:

 JPanel aPanel = new JPanel(){
      @Override
      public Dimension getPreferredSize(){
           Dimension d = super.getPreferredSize();
           Border b = this.getBorder();
           if(b == null) return d;
           if(!(b instanceof TitledBorder)) return d;
           TitledBorder tb = (TitledBorder)b;
           if(tb.getTitle() == null) return d;
           int insets = 2 * (tb.getBorderInsets(this).left + tb.getBorderInsets(this).right);
           double minWidth = this.getFontMetrics(tb.getTitleFont()).stringWidth(tb.getTitle()) + insets;
           if(d.getWidth() > minWidth) return d;
           return new Dimension((int)minWidth, d.height);
      }
 };
0 голосов
/ 03 июля 2013

Я «решил» это, добавив метку (BoxLayout.Y_AXIS) вверху (или внизу) панели.Метка содержит только пробелы, ведущие к одинаковой (или большей) ширине заголовка.(Создание ярлыка с тем же текстом, что и заголовок невидимым, не решает его.)

...