#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 далек от совершенства.