JLabel не отображает все символы даже после динамического изменения размера шрифта - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь привести предложение, которое часто меняется, в несколько джаблей. Ширина моих 3-х джабелей остается неизменной все время. Что я делаю, так это изменяю размер шрифта, чтобы все символы могли уместиться, не выходя за пределы диапазона отображения меток. Что я делаю, так это звоню ниже фрагмента кода, когда меняется предложение.

Вот мой код

    String sentence = "Some long sentence";
    int SentenceLength = sentence.length();
    int FontSize = 0;
    // sum of widths of the three labels
    int TotalLblLength=lbl_0ValueInWords.getWidth()+lbl_1ValueInWords.getWidth()+lbl_1ValueInWords.getWidth();

    /*decide the font size so that all the characters can be displayed 
     with out exceeding the display renge(horizontal) of the 3 labels 
     Inconsolata -> monopace font
     font size == width of the font*2 (something I observed, not sure 
     if this is true always)  */
    FontSize=(TotalLblLength/SentenceLength)*2;          
    // max font size is 20 - based on label height
    FontSize=(FontSize>20)?20:FontSize; 

    lbl_0ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));
    lbl_1ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));
    lbl_2ValueInWords.setFont(new java.awt.Font("Inconsolata", 0,FontSize));

    int CharCount_lbl0 = width_lbl0 / (FontSize / 2);
    int CharCount_lbl1 = width_lbl1 / (FontSize / 2);
    int CharsCount_lbl2 = width_lbl2 / (FontSize / 2);

    /*Set texts of each label
     if sentence has more than the number of characters that can fit in the
     1st label, excessive characters are moved to the 2nd label. same goes 
     for the 2nd and 3rd labels*/
    if (SentenceLength > CharCount_lbl0) {
        lbl_0ValueInWords.setText(sentence.substring(0, CharCount_lbl0));
        if (SentenceLength > CharCount_lbl0 + CharCount_lbl1) {
            lbl_1ValueInWords.setText(sentence.substring(CharCount_lbl0, CharCount_lbl0 + CharCount_lbl1));
            lbl_2ValueInWords.setText(sentence.substring(CharCount_lbl0 + CharCount_lbl1, SentenceLength));
        } else {
            lbl_1ValueInWords.setText(sentence.substring(CharCount_lbl0, SentenceLength));
        }
    } else {

        lbl_0ValueInWords.setText(sentence);
    }

Но даже после сброса размера шрифта последний символ иногда выходит за пределы диапазона отображения. Я удалил поля с jlabels, которые могут вызвать это. Это происходит для предложений произвольной длины. Я могу решить проблему для приложения, уменьшив ширину метки, используемую для расчетов (надеюсь)

Может кто-нибудь объяснить мне причину? Может быть из-за какого-то дефекта в симметрии шрифтов?

1 Ответ

2 голосов
/ 25 мая 2010

Нет такой вещи как симметрия шрифта?

Есть 2 типа шрифтов для того, с чем вы имеете дело. Моно-космические шрифты и немоно-космические шрифты. Моноширинные шрифты имеют одинаковую ширину для каждого символа, который вы можете напечатать. Другие нет.

Кроме того, шрифты по-разному отображаются в разных ОС. Что-то в Windows будет на 10-20% длиннее на Mac, потому что они по-разному распределяют шрифты.

Что бы вы ни пытались сделать с JLabels, остановитесь. Вы не должны использовать 3 JLabels, чтобы показать 3 строки текста, потому что они не подходят. Удалите их и используйте JTextArea. Он имеет перенос текста, вы можете установить шрифт, удалить поле / рамку / отступы и сделать его недоступным для редактирования. Вы можете легко настроить его, чтобы он не отличался от JLabel, но это сэкономит вам массу работы.

Выберите правильный инструмент для правильной работы.

...