Как я могу контролировать центрирование текста JButton HTML в NetBeans? - PullRequest
6 голосов
/ 06 августа 2011

Я пытаюсь поместить двухстрочный текст в JButton; например,

+----------+
|  READER  |
|   STOP   |
+----------+

Но у меня проблемы с центрированием на кнопке. Я захожу в редактор свойств для JButton и ввожу <html><center>READER<br>STOP для свойства text . Это приводит к тому, что два слова центрируются относительно друг друга, но вместе они все-таки кажутся смещенными в сторону правой стороны лицевой стороны кнопки, как в:

+----------+
|    READER|
|     STOP |
+----------+

Существуют также свойства «Горизонтальное и вертикальное выравнивание» и «Положение текста», для которых я установил все на CENTER, но это не оказывает никакого влияния, которое я вижу.

РЕДАКТИРОВАТЬ: вот иллюстрация того, как это изложено, когда я опускаю <center> полностью, на случай, если кто-то будет смущен моим описанием, что «ЧИТАТЕЛЬ и СТОП выровнены по левому краю относительно друг друга, но вправо Выровняется по кнопке ":

+----------+
|    READER|
|    STOP  |
+----------+

РЕДАКТИРОВАТЬ: вот код, сгенерированный NetBeans:

    readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
    readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
    readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
    readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
    readerStopButton_.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    readerStopButton_.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            readerStopButton_ActionPerformed(evt);
        }
    });
    operationButtons_.add(readerStopButton_);

РЕДАКТИРОВАТЬ: Вот снимок экрана, как кнопка выглядит для меня. Я многое не знаю о работе с макетами, поэтому вполне возможно, что я опущу некоторую важную информацию. Но в основном я позволяю NetBeans выполнять всю работу, за исключением предоставления текста HTML.

РЕДАКТИРОВАТЬ: создание замены экрана, который показывает все кнопки. Обратите внимание, что те, которые не используют HTML (однословные), выровнены правильно, тогда как те, которые используют HTML, перепутаны.

better view of problem

Ответы [ 3 ]

8 голосов
/ 06 августа 2011

Не забудьте заключительный тег:

JButton button = new JButton("<html><center>READER<br>STOP</center></html>");

См. Также Как использовать HTML в компонентах Swing .

Добавление:Я бесстыдно клонировал правильный код @ mre * выше, чтобы создать следующее изображение:

enter image description here

4 голосов
/ 06 августа 2011

Я не уверен, о чем ты говоришь. Я использовал код, который вы включили, и он прекрасно работает.


public final class HTMLTextButtonDemo {

    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());

        JButton readerStopButton_ = new JButton();
        readerStopButton_.setFocusPainted(false);
        readerStopButton_.setBackground(UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setHorizontalTextPosition(SwingConstants.CENTER);

        frame.add(readerStopButton_);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

enter image description here


Текст HTML выровнен по центру. Трудно представить, что вы видите что-то другое.

3 голосов
/ 06 августа 2011

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

readerStopButton_.setMargin(new Insets(0,-30, 0,-30));

enter image description here

package swing;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

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

    private static void createAndShowGUI() {

        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JPanel operationButtons_ = new JPanel();

        JButton readerStopButton_ = new JButton();
        readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
        readerStopButton_.setMargin(new Insets(0,-30, 0,-30));
        readerStopButton_.setPreferredSize(new Dimension(66, 40));
        operationButtons_.add(readerStopButton_);

        readerStopButton_ = new JButton();
        readerStopButton_.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.light"));
        readerStopButton_.setFont(new java.awt.Font("Geneva", 0, 12)); // NOI18N
        readerStopButton_.setText("<html><center>READER<br>STOP</center></html>\n");
        readerStopButton_.setToolTipText("<html><b>Stop</b> button is currently inactive.  ");
        System.out.println(readerStopButton_.getPreferredSize());
        readerStopButton_.setPreferredSize(new Dimension(66, 40));
        operationButtons_.add(readerStopButton_);

        operationButtons_.add(new JButton("yCoder.com"));

        frame.add(operationButtons_);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
...