我目前正在使用FlatLaf UI作为Swing应用程序的外观和感觉。
FlatLaf提供了一种基于字体大小的用户缩放机制,例如:
12pt: 1.0 | 100%
16pt: 1.3 | 130%这意味着计算所有边界和嵌入时都考虑到了这一因素:
BorderFactory.createEmptyBorder(UIScale.scale(10), ... // Which means 10 * 1.3, for example当更改用户比例并在屏幕上显示组件时,就会出现问题。
如果我在类构造函数上添加和自定义组件..。
public class ProtocolSearchBar extends Box {
public ProtocolSearchBar() {
...
add(protocolLabel);
add(Box.createHorizontalStrut(UIScale.scale(10)));
add(protocol);
add(Box.createHorizontalStrut(UIScale.scale(10)));
add(fetchButton);
}
......how我能在用户每次改变UI比例时有效地更新它们的嵌入吗?
FlatLaf提供了一个要通知的回调。
UIScale.addPropertyChangeListener(event -> {
if ("userScaleFactor".equals(event.getPropertyName())) {
...
}
});发布于 2021-04-18 12:40:34
一个很好的解决方案是扩展标准的Swing组件。
public class ScaledFiller extends Filler {
public enum Axis {
X_AXIS,
Y_AXIS
}
public ScaledFiller(final int size, final Axis axis) {
super(
new Dimension(axis == X_AXIS ? size : 0, axis == Y_AXIS ? size : 0),
new Dimension(axis == X_AXIS ? size : 0, axis == Y_AXIS ? size : 0),
new Dimension(axis == X_AXIS ? size : Short.MAX_VALUE, axis == Y_AXIS ? size : Short.MAX_VALUE)
);
}
public ScaledFiller(final Dimension min, final Dimension pref, final Dimension max) {
super(min, pref, max);
}
@Override
public Dimension getMinimumSize() {
return new ScaledDimension(super.getMinimumSize());
}
@Override
public Dimension getPreferredSize() {
return new ScaledDimension(super.getPreferredSize());
}
@Override
public Dimension getMaximumSize() {
return new ScaledDimension(super.getMaximumSize());
}
}并用作
@NotNull
public static Filler horizontalStrut(final int size) {
return new ScaledFiller(size, ScaledFiller.Axis.X_AXIS);
}
@NotNull
public static Filler verticalStrut(final int size) {
return new ScaledFiller(size, ScaledFiller.Axis.Y_AXIS);
}https://stackoverflow.com/questions/67148216
复制相似问题