Как установить текст над и под значком JButton? - PullRequest
3 голосов
/ 13 ноября 2011

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

Есть ли более прямой способ сделать это?

Примечание - Я не ищу решение multi-line , я ищу решение multi-label .Хотя эта статья именует его как многострочное решение, на самом деле, похоже, оно ссылается на решение с несколькими метками .


ПРИМЕР

import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public final class JButtonDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }


    private static void createAndShowGUI(){
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.add(new JMultiLabelButton());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static final class JMultiLabelButton extends JButton
    {
        private static final long serialVersionUID = 7650993517602360268L;

        public JMultiLabelButton()
        {
            super();
            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            add(new JCenterLabel("Top Label"));
            add(new JCenterLabel(UIManager.getIcon("OptionPane.informationIcon"))); 
            add(new JCenterLabel("Bottom Label"));
        }
    }

    private static final class JCenterLabel extends JLabel
    {
        private static final long serialVersionUID = 5502066664726732298L;

        public JCenterLabel(final String s)
        {
            super(s);
            setAlignmentX(Component.CENTER_ALIGNMENT);
        }

        public JCenterLabel(final Icon i)
        {
            super(i);
            setAlignmentX(Component.CENTER_ALIGNMENT);
        }
    }

}

enter image description here

Ответы [ 3 ]

5 голосов
/ 14 ноября 2011

Нет способа разделить текст между верхом / низом JButton. Это будет связано с заказной живописью.

Поскольку я не уверен в ваших точных требованиях, я просто изложу несколько случайных идей:

  1. Вы можете использовать JButton с текстом и значком. В API есть методы, позволяющие контролировать расположение текста относительно значка. Тогда вам понадобится вторая метка для другой строки текста. По сути, то же самое, что и текущее решение, но вам нужны только две метки.

  2. Вы можете использовать классы Text Icon и Compound Icon для создания 1 значка из 3 отдельных значков. Затем вы можете просто добавить значок к кнопке.

  3. Используйте JTextPane. Он поддерживает метод insertIcon (). Таким образом, вы можете добавить строку текста, добавить значок, а затем добавить другую строку текста. Вы можете поиграть с атрибутами абзаца текстовой панели, чтобы выровнять текст по горизонтали внутри пространства, если вы не хотите, чтобы текст выравнивался по левому краю. Вы также можете поиграть с цветом фона, чтобы он выглядел как ярлык.

Пример использования CompoundIcon:

import java.awt.*;
import javax.swing.*;

public final class JButtonDemo {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }


    private static void createAndShowGUI()
    {
        JButton button = new JButton();

        CompoundIcon icon = new CompoundIcon(CompoundIcon.Axis.Y_AXIS,
            new TextIcon(button, "Top Label"),
            UIManager.getIcon("OptionPane.informationIcon"),
            new TextIcon(button, "Bottom Label"));

        button.setIcon( icon );
        button.setFocusPainted( false );

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.add( button );
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
2 голосов
/ 14 ноября 2011

у вас есть две четыре опции

1) использовать JLabel + Icon + Html (<= Html 3.2) </p>

2) использовать XxxButtonUI и переопределить все необходимые методы из API

3) JLayeredPane с полупрозрачностью ???, другой Layout с полупрозрачностью, как JLabel или JComponent для JButton,

4) существует множество графических программ, которые могут подготовить Background как* .jpg для Icon, тогда очень просто изменить что-либо по событию, действию или фактической настройке для JButton

неверный способ ищет JLabel + Независимо от JButton, я думаю, что это обходной путь половинного размера

0 голосов
/ 13 ноября 2011

Найдите еще LayoutManager, здесь: http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html

...