首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用户规模更改时更新组件边框/附件

在用户规模更改时更新组件边框/附件
EN

Stack Overflow用户
提问于 2021-04-18 11:55:24
回答 1查看 85关注 0票数 1

我目前正在使用FlatLaf UI作为Swing应用程序的外观和感觉。

FlatLaf提供了一种基于字体大小的用户缩放机制,例如:

代码语言:javascript
运行
复制
12pt: 1.0 | 100%
16pt: 1.3 | 130%

这意味着计算所有边界和嵌入时都考虑到了这一因素:

代码语言:javascript
运行
复制
BorderFactory.createEmptyBorder(UIScale.scale(10), ... // Which means 10 * 1.3, for example

当更改用户比例并在屏幕上显示组件时,就会出现问题。

如果我在类构造函数上添加和自定义组件..。

代码语言:javascript
运行
复制
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提供了一个要通知的回调。

代码语言:javascript
运行
复制
UIScale.addPropertyChangeListener(event -> {
  if ("userScaleFactor".equals(event.getPropertyName())) {
    ...
  }
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 12:40:34

一个很好的解决方案是扩展标准的Swing组件。

代码语言:javascript
运行
复制
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());
  }
}

并用作

代码语言:javascript
运行
复制
@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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67148216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档