Arhn - архитектура программирования

Как добавить новую строку в JLabel без использования HTML

Как я могу добавить новую строку в JLabel? Я знаю, что если я использую простой HTML, это сработает. Но если я использую HTML, JLabel не показывает шрифт, встроенный в приложение. Я встраиваю шрифт с помощью метода - createFont() и использую JLabel.setFont() для применения шрифта.

07.09.2011

Ответы:


1

Я встраиваю шрифт с помощью метода - createFont()) и использую JLabel.setFont() для применения шрифта.

Вместо этого попробуйте установить его в HTML, как показано здесь.

07.09.2011
  • С моей точки зрения, основная проблема с использованием HTML - это потеря базовой линии, которую в настоящее время использует большинство LayoutManagers (и это хороший момент, ИМХО). 07.09.2011

  • 2

    SwingX поддерживает многострочные метки:

       JXLabel label = new JXLabel();
       label.setLineWrap(true);
    
    07.09.2011
  • Имеет ли JXLabel правильный базовый уровень при использовании нескольких строк текста? Обратите внимание, что право может означать разные вещи для разных людей ;-) 07.09.2011
  • @jfpoilpret - не знаю. Какой будет правильная базовая линия? 07.09.2011
  • для меня правильной базовой линией будет базовая линия первого символа первой строки метки. Но я уверен, что вы могли бы найти других людей, которые предпочитают, например, базовую линию, центрированную по всей высоте этикетки; другие люди также могут захотеть, чтобы базовая линия была базовой линией первого символа ПОСЛЕДНЕЙ строки в метке. На самом деле это зависит от того, как люди хотят, чтобы ярлыки были выровнены в их макетах. Я думаю, что мое первое предложение имеет смысл больше всего. 09.09.2011

  • 3


    Я не думаю, что есть прямой (и простой) способ сделать JLabel с несколькими строками, не возвращаясь к HTML. Вместо этого вы можете использовать JTextArea.

    JTextArea textArea = new JTextArea();
    textArea.setEditable(false);
    textArea.setLineWrap(true);
    textArea.setOpaque(false);
    textArea.setBorder(BorderFactory.createEmptyBorder());
    add(textArea, BorderLayout.CENTER);
    

    Он должен выглядеть почти так же. Если у вас есть разные шрифты для разных компонентов, вы можете добавить следующую строку, чтобы убедиться, что шрифт JTextArea совпадает с JLabel

    textArea.setFont(UIManager.getFont("Label.font"));
    

    Надеюсь это поможет.

    07.09.2011
  • я могу выровнять текст JTextArea ?? 07.09.2011
  • Проверьте этот пост stackoverflow.com/questions/3213045/ 07.09.2011

  • 4

    JLabel изначально не предназначен для многострочного текста, насколько я помню. Вам нужно будет переопределить различные методы рендеринга, чтобы вручную разбить строку текста.

    Возможно, вам следует использовать нередактируемый JTextArea, если вам нужны многострочные метки.

    07.09.2011

    5

    1) если вы хотите использовать многострочные JComponents без использования JLabel, вам нужно искать TextComponent, а также JTextArea, JTextPane, JEditorPane, если их нельзя редактировать, то myTextComponent#setEditable(false);

    2) Я никогда не вижу проблем с Html & Font & Color в Swing, например:

    введите здесь описание изображения

    import java.awt.Color;
    import java.awt.Font;
    import javax.swing.*;
    
    public class ButtonFg extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        public ButtonFg() {
            JButton button = new JButton("<html> - myText <br>"
                    + " - myText <br>"
                    + " - myText <br>"
                    + " - myText </html>");
            button.setForeground(Color.blue);
            button.setFont(new Font("Serif", Font.BOLD, 28));
            button.setFocusPainted(false);
            add(button);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocation(150, 150);
            pack();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new ButtonFg().setVisible(true);
                }
            });
        }
    }
    
    07.09.2011

    6

    Большая часть следующего кода взята из BasicLabelUI и/или WindowsLabelUI, но я добавил код, чтобы заставить его работать с несколькими строками. Это был минимальный объем скопированного кода, который я мог заставить работать. Вы можете установить символ-разделитель между строками с помощью setSeparator или изменив значение по умолчанию при создании экземпляра LinesAndIndex. Я не проводил обширных испытаний по этому поводу, но пока это работает для меня. При использовании HTML мнемоника не работала, поэтому я создал ее. Если у вас есть лучший способ сделать это, исправьте код.

        import com.sun.java.swing.plaf.windows.WindowsLabelUI;
        import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
        import java.awt.Color;
        import java.awt.FontMetrics;
        import java.awt.Graphics;
        import java.awt.Insets;
        import java.awt.Rectangle;
        import java.util.ArrayList;
        import java.util.List;
        import javax.swing.Icon;
        import javax.swing.JComponent;
        import javax.swing.JLabel;
        import javax.swing.UIManager;
        import javax.swing.plaf.LabelUI;
        import javax.swing.plaf.basic.BasicGraphicsUtils;
        import javax.swing.plaf.basic.BasicHTML;
        import javax.swing.text.View;
    
        public class MultiLineLabelUI extends WindowsLabelUI {
            private static MultiLineLabelUI multiLineLabelUI;
            private LinesAndIndex lai = new LinesAndIndex(',');
            private Rectangle paintIconR = new Rectangle();
            private Rectangle paintTextR = new Rectangle();
            public static LabelUI createUI(JComponent c) {
                if (multiLineLabelUI == null) {
                    multiLineLabelUI = new MultiLineLabelUI();
                }
                return multiLineLabelUI;
            }
            private int getBaseline(JComponent c, int y, int ascent, int w, int h) {
                View view = (View) c.getClientProperty(BasicHTML.propertyKey);
                if (view != null) {
                    int baseline = BasicHTML.getHTMLBaseline(view, w, h);
                    if (baseline < 0) {
                        return baseline;
                    }
                    return y + baseline;
                }
                return y + ascent;
            }
            public char getSeparator() {
                return lai.getSeparator();
            }
            public void setSeparator(char ch) {
                lai.setSeparator(ch);
            }
            private String layout(JLabel label, FontMetrics fm,
                    int width, int height, int lineCnt, int curLine, String text) {
                Insets insets = label.getInsets(null);
                Icon icon = (label.isEnabled()) ? label.getIcon()
                        : label.getDisabledIcon();
                Rectangle paintViewR = new Rectangle();
                paintViewR.width = width - (insets.left + insets.right);
                paintViewR.height = (height - (insets.top + insets.bottom)) / lineCnt;
                paintViewR.x = insets.left;
                paintViewR.y = insets.top + (paintViewR.height * curLine);
                paintIconR.x = 0;
                paintIconR.y = 0;
                paintIconR.width = 0;
                paintIconR.height = 0;
                paintTextR.x = 0;
                paintTextR.y = 0;
                paintTextR.width = 0;
                paintTextR.height = 0;
                return layoutCL(label, fm, text, icon, paintViewR, paintIconR,
                        paintTextR);
            }
            protected void paintEnabledText(JLabel l, Graphics g,
                    String s, int textX, int textY, int curLine) {
                int mnemonicIndex = lai.getMnemonicIndex();
                // W2K Feature: Check to see if the Underscore should be rendered.
                if (WindowsLookAndFeel.isMnemonicHidden() == true) {
                    mnemonicIndex = -1;
                }
                if (curLine != lai.getMnemonicLineIndex()) {
                    mnemonicIndex = -1;
                }
    
                g.setColor(l.getForeground());
                BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
                        textX, textY);
            }
            protected void paintDisabledText(JLabel l, Graphics g,
                    String s, int textX, int textY, int curLine) {
                int mnemonicIndex = lai.getMnemonicIndex();
                // W2K Feature: Check to see if the Underscore should be rendered.
                if (WindowsLookAndFeel.isMnemonicHidden() == true) {
                    mnemonicIndex = -1;
                }
                if (curLine != lai.getMnemonicLineIndex()) {
                    mnemonicIndex = -1;
                }
                if (UIManager.getColor("Label.disabledForeground") instanceof Color
                        && UIManager.getColor("Label.disabledShadow") instanceof Color) {
                    g.setColor(UIManager.getColor("Label.disabledShadow"));
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
                            textX + 1, textY + 1);
                    g.setColor(UIManager.getColor("Label.disabledForeground"));
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
                            textX, textY);
                } else {
                    Color background = l.getBackground();
                    g.setColor(background.brighter());
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
                            textX + 1, textY + 1);
                    g.setColor(background.darker());
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g, s, mnemonicIndex,
                            textX, textY);
                }
            }
            @Override
            public void paint(Graphics g, JComponent c) {
                JLabel label = (JLabel) c;
                String text = label.getText();
                Icon icon = (label.isEnabled())
                        ? label.getIcon()
                        : label.getDisabledIcon();
    
                if ((icon == null) && (text == null)) {
                    return;
                }
                char mnemonic = (char) label.getDisplayedMnemonic();
                lai.splitText(text, mnemonic);
                List<String> lines = lai.getLines();
    
                FontMetrics fm = label.getFontMetrics(g.getFont());
                String[] clippedText = new String[lines.size()];
                for (int i = 0; i < lines.size(); i++) {
                    clippedText[i] = layout(label, fm, c.getWidth(), c.getHeight(),
                            lines.size(), i, lines.get(i));
    
                    if (icon != null && i == 0) {
                        icon.paintIcon(c, g, paintIconR.x, paintIconR.y);
                    }
    
                    if (text != null) {
                        int textX = paintTextR.x;
                        int textY = paintTextR.y + fm.getAscent();
    
                        if (label.isEnabled()) {
                            paintEnabledText(label, g, clippedText[i], textX,
                                    textY, i);
                        } else {
                            paintDisabledText(label, g, clippedText[i], textX,
                                    textY, i);
                        }
                    }
                }
            }
            @Override
            public int getBaseline(JComponent c, int width, int height) {
                super.getBaseline(c, width, height);
                JLabel label = (JLabel) c;
                String text = label.getText();
                if (text == null || "".equals(text) || label.getFont() == null) {
                    return -1;
                }
                char mnemonic = (char) label.getDisplayedMnemonic();
                lai.splitText(text, mnemonic);
                List<String> lines = lai.getLines();
                FontMetrics fm = label.getFontMetrics(label.getFont());
                String[] clippedText = new String[lines.size()];
                for (int i = 0; i < lines.size(); i++) {
                    clippedText[i] = layout(label, fm, width, height, lines.size(), i,
                            lines.get(i));
                }
                return getBaseline(label, paintTextR.y, fm.getAscent(),
                        paintTextR.width, paintTextR.height);
            }
    
            private static class LinesAndIndex {
                private char sep;
                private List<String> lines;
                private int mnemonicLineIndex;
                private int mnemonicIndex;
                LinesAndIndex(char sep) {
                    mnemonicLineIndex = -1;
                    mnemonicIndex = -1;
                    lines = new ArrayList<String>();
                    this.sep = sep;
                }
                public char getSeparator() {
                    return sep;
                }
                public void setSeparator(char sep) {
                    this.sep = sep;
                }
                public List<String> getLines() {
                    return lines;
                }
                public int getMnemonicLineIndex() {
                    return mnemonicLineIndex;
                }
                public int getMnemonicIndex() {
                    return mnemonicIndex;
                }
                public void splitText(String text, char mnemonic) {
                    if (text == null) {
                        return;
                    }
                    lines.clear();
                    mnemonicLineIndex = -1;
                    mnemonicIndex = -1;
                    char um = Character.toUpperCase(mnemonic);
                    char lm = Character.toLowerCase(mnemonic);
                    int umi = Integer.MAX_VALUE;
                    int lmi = Integer.MAX_VALUE;
                    int umli = -1;
                    int lmli = -1;
                    for (int i = 0, j = 0, k = 0; i < text.length(); i++) {
                        if (text.charAt(i) == sep) {
                            lines.add(text.substring(j, i));
                            j = i + 1;
                            k++;
                        } else if (text.charAt(i) == um) {
                            if (umi == Integer.MAX_VALUE) {
                                umi = i - j;
                                umli = k;
                            }
                        } else if (text.charAt(i) == lm) {
                            if (lmi == Integer.MAX_VALUE) {
                                lmi = i - j;
                                lmli = k;
                            }
                        }
                        if (i == text.length() - 1) {
                            lines.add(text.substring(j, i + 1));
                        }
                    }
                    mnemonicLineIndex = (lmi < umi) ? lmli : umli;
                    mnemonicIndex = (lmi < umi) ? lmi : umi;
                }
            }
    
        }
    
    08.01.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..