1

TitledBorderのJPanelを持っていますが、パネルの内容が境界線のタイトルよりも狭く、タイトルが切り捨てられます。ここに示されているように、幅の手動設定に注意を払っているJPanelにBoxLayoutを使用しています。TitledBorder getMinimumSize()関数とそのコンポーネントの幅に従って、パネルの最小、最大、および優先幅を設定しようとしましたが、すべてが機能しません。うまくいったのはボックスフィラーを使用することだけでしたが、それは望ましくないインデントを導入しました。

含まれているコンテンツに関係なく、完全なタイトルを表示する方法はありますか?

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

3 に答える 3

2

必要な幅を計算するのはどうですか?

       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);
        }
于 2011-06-20T07:53:37.727 に答える
1

これは私にとってうまく機能します:

 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);
      }
 };
于 2016-10-03T01:37:49.160 に答える
0

パネルの上部(または下部)にラベル(BoxLayout.Y_AXIS)を追加することで、これを「解決」しました。ラベルには、タイトルの同じ(またはそれ以上)幅につながるスペースのみが含まれます。(タイトルとまったく同じテキストのラベルを非表示にしても解決しません。)

于 2013-07-02T22:06:20.113 に答える