Как остановить изменение высоты JButton после добавления подчеркивания?

#java #html #jbutton #preferredsize

#java #HTML #jbutton #предпочтительный размер

Вопрос:

Итак, у меня есть JButton то, что при наведении на него курсора появляется подчеркивание с использованием HTML. Однако, когда добавляется подчеркивание, оно делает JButton немного больше, чем должно быть.

Я попробовал несколько вещей, таких как

button.setMaximumSize(button.getPreferredSize());

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

У меня есть пример класса ниже, который демонстрирует проблему (я не смог придать ей точно такую же серьезность, но этого достаточно, чтобы показать проблему).

ПРИМЕР КЛАССА

 import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.plaf.metal.MetalButtonUI;

public class UnderlineSample extends JFrame {
    public UnderlineSample() {
        super("Underline Sample");
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 150));

        String text =
                "<html>"
                      "<p style = 'border-bottom: 1px solid rgba(0,0,0,0,0); box-sizing: border-box;'>"
                          "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>"
                              "Sample"
                          "</span> "
                          " underline button"
                      "</p>"
                 "</html>";
        JButton button = new JButton(text);
        button.setFont(new Font("", Font.PLAIN, 18));
        button.setFocusable(false);
        button.setBackground(Color.LIGHT_GRAY);
        button.setForeground(Color.BLACK);
        button.setUI(new MetalButtonUI());
        button.setHorizontalAlignment(SwingConstants.LEFT);
        button.setAlignmentX(LEFT_ALIGNMENT);

        button.addMouseListener(new MouseAdapter() {
            public void mouseEntered(MouseEvent e) {
                String s =
                    "<html>"
                          "<p style = 'border-bottom: 1px solid black; box-sizing: border-box;'>"
                              "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>"
                                  "Sample"
                              "</span> "
                              " underline button"
                          "</p>"
                     "</html>";
                button.setText(s);
            }

            public void mouseExited(MouseEvent e) {
                String s =
                    "<html>"
                          "<p style = 'border-bottom: 1px solid rgba(0,0,0,0,0); box-sizing: border-box;'>"
                              "<span style = 'color: rgb(0, 0, 255); font-weight: bold;'>"
                                  "Sample"
                              "</span> "
                              " underline button"
                          "</p>"
                     "</html>";
                button.setText(s);
            }
        });

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.WEST;
        gbc.weightx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.ipady = 10;
        gbc.insets = new Insets(0, 10, 5, 10);

        add(button, gbc);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new UnderlineSample();
    }
}
  

Ответ №1:

Рендеринг html/css in Swing не поддерживает все стили css. Приведенный пример rgba не работает (вы можете проверить это самостоятельно, добавив цветную рамку, используя rgba которую вы ожидаете, чтобы она отображалась, а не с буквой 0, и посмотреть результат).

Другими словами, граница с rgba не отображается, отсюда и изменение размера при добавлении отображаемой нижней границы с MouseListener.mouseEntered помощью . Вы можете обмануть это, используя rgb тот же цвет, что и цвет фона. Что-то вроде:

 <p style = 'border-bottom: 1px solid rgb(200,200,200); box-sizing: border-box;'>
  

Комментарии:

1. Спасибо, это сработало. Однако у меня есть последний вопрос. При попытке этого я заметил, что пробелы между значениями rgb привели к тому, что он не работал. Например, пока это работало: rgb(4,137,181); , это не сработало: rgb(4, 137, 181); . вы знаете, почему это так?

2. Рад, что это сработало. I noticed that spaces between the rgb values caused it to not work Технически разрешены пробелы — это демонстрация того, что синтаксический анализатор Swing css / html далек от совершенства.