JButton settext определенная позиция

У меня есть JButton со значком изображения, и мне нужно разместить текст. Есть ли способ разместить текст JButton в определенной позиции вместо использования CENTER, LEADING, TOP и т. д.?


person user3354252    schedule 05.03.2014    source источник
comment
Короткий ответ, нет. Длинный ответ, зависит, но вы можете использовать <html>, чтобы получить больше контроля, но вам нужно будет напрямую смешать изображение и текст в html...   -  person MadProgrammer    schedule 05.03.2014


Ответы (3)


Я никогда раньше не пробовал это на JButton, но, может быть, вы можете добавить JLabel в качестве компонента на кнопку. Затем вы можете использовать менеджеры компоновки или границы, чтобы расположить метку более подходящим образом.

Вот несколько примеров добавления компонента в JLabel со значком:

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

public class LabelImageText extends JPanel
{
    public LabelImageText()
    {
        JLabel label1 = new JLabel( new ColorIcon(Color.ORANGE, 100, 100) );
        label1.setText( "Easy Way" );
        label1.setHorizontalTextPosition(JLabel.CENTER);
        label1.setVerticalTextPosition(JLabel.CENTER);
        add( label1 );

        //

        JLabel label2 = new JLabel( new ColorIcon(Color.YELLOW, 200, 150) );
        label2.setLayout( new BoxLayout(label2, BoxLayout.Y_AXIS) );
        add( label2 );

        JLabel text = new JLabel( "More Control" );
        text.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        label2.add( Box.createVerticalGlue() );
        label2.add( text );
        label2.add( Box.createVerticalStrut(10) );

        //

        JLabel label3 = new JLabel( new ColorIcon(Color.GREEN, 200, 150) );
        label3.setLayout( new GridBagLayout() );
        add( label3 );

        JLabel text3 = new JLabel();
        text3.setText("<html><center>Text<br>over<br>Image<center></html>");
        text3.setLocation(20, 20);
        text3.setSize(text3.getPreferredSize());
        label3.add( text3 );

        //

        JLabel label4 = new JLabel( new ColorIcon(Color.CYAN, 200, 150) );
        add( label4 );

        JTextPane textPane = new JTextPane();
        textPane.setText("Add some text that will wrap at your preferred width");
        textPane.setEditable( false );
        textPane.setOpaque(false);
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        StyledDocument doc = textPane.getStyledDocument();
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
        textPane.setBounds(20, 20, 75, 100);
        label4.add( textPane );
    }

    public static class ColorIcon implements Icon
    {
        private Color color;
        private int width;
        private int height;

        public ColorIcon(Color color, int width, int height)
        {
            this.color = color;
            this.width = width;
            this.height = height;
        }

        public int getIconWidth()
        {
            return width;
        }

        public int getIconHeight()
        {
            return height;
        }

        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            g.setColor(color);
            g.fillRect(x, y, width, height);
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("LabelImageText");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new LabelImageText() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

Я сомневаюсь, что пример JTExtPane будет работать с кнопкой, потому что текстовая панель будет перехватывать события мыши, и поэтому вы не сможете нажать кнопку при нажатии на текст. Поэтому я бы придерживался примеров, которые добавляют метку к кнопке.

person camickr    schedule 05.03.2014
comment
Спасибо за это, очень помогло. Другое дело, как мне использовать тот же текст метки? Я делаю i18n, и каждый раз, когда я переключаю локали, он добавляет новую метку поверх предыдущей или не сбрасывает текст. - person user3354252; 05.03.2014
comment
Я наверное не сбрасываю текст. Это то, что вам нужно будет сделать вручную. Я не уверен, какой слушатель вы бы использовали. - person camickr; 05.03.2014

Испанский: Выбрать метод setText(String str).

Google Traductor English: Вы можете перезаписать метод setText (String str).

private static final String HTML_1 = "<html><body style='margin:0px 0px 0px 0px'>";
private static final String HTML_2 = "</html>";

@Override
public void setText(String txt) {
    if (txt.isEmpty()) {
        txt = "Dispositivo";
    }
    String txt2 = HTML_1 + txt + HTML_2;
    super.setText(txt2);
}
person Marco Antonio Hermosilla    schedule 03.08.2015

вы можете использовать метод set bounds, чтобы установить положение текста на кнопке

JLabel positiongLabel = new JLabel();
positiongLabel.setBounds(100,50,300,30);

для более подробной информации нажмите здесь

person Engineer    schedule 05.03.2014
comment
@camickr теперь не зависит от SWT - person Engineer; 05.03.2014
comment
Теперь вы используете компоненты AWT, а не компоненты Swing. Кроме того, это не отвечает на вопрос. Вопрос заключается в расположении текста внутри кнопки, а не в расположении кнопки внутри фрейма. Также вы не должны использовать компоненты setBounds() для позиций. Вы должны использовать менеджеры компоновки. - person camickr; 05.03.2014