添加下划线后如何阻止 JButton 的高度发生变化?
How to stop a JButton's height from changing after adding an underline?
所以我有一个 JButton
,当您将鼠标移到它上面时,使用 HTML 会出现一个下划线。但是,当添加下划线时,它会使 JButton
比预期的大一点。
我尝试了一些方法,例如
button.setMaximumSize(button.getPreferredSize());
在添加下划线之前,我一直无法修复它。那么,无论是否存在下划线,如何确保高度保持不变。
我在下面有一个示例 class 演示了这个问题(我无法让它具有完全相同的严重性,但足以说明问题)。
样本CLASS
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();
}
}
Swing 中 html/css
的呈现不支持所有 css 样式。 rgba
的例子不起作用(您可以通过使用 rgba
添加彩色边框来自己测试,您希望呈现的是而不是带有 alpha 0 的边框并查看结果)。
换句话说,带有 rgba
的边框未被渲染,因此当您添加带有 MouseListener.mouseEntered
的可渲染边框底部时尺寸会发生变化。您可以使用与背景颜色相同的 rgb
来欺骗它。类似于:
<p style = 'border-bottom: 1px solid rgb(200,200,200); box-sizing: border-box;'>
所以我有一个 JButton
,当您将鼠标移到它上面时,使用 HTML 会出现一个下划线。但是,当添加下划线时,它会使 JButton
比预期的大一点。
我尝试了一些方法,例如
button.setMaximumSize(button.getPreferredSize());
在添加下划线之前,我一直无法修复它。那么,无论是否存在下划线,如何确保高度保持不变。
我在下面有一个示例 class 演示了这个问题(我无法让它具有完全相同的严重性,但足以说明问题)。
样本CLASS
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();
}
}
Swing 中 html/css
的呈现不支持所有 css 样式。 rgba
的例子不起作用(您可以通过使用 rgba
添加彩色边框来自己测试,您希望呈现的是而不是带有 alpha 0 的边框并查看结果)。
换句话说,带有 rgba
的边框未被渲染,因此当您添加带有 MouseListener.mouseEntered
的可渲染边框底部时尺寸会发生变化。您可以使用与背景颜色相同的 rgb
来欺骗它。类似于:
<p style = 'border-bottom: 1px solid rgb(200,200,200); box-sizing: border-box;'>