gpt4 book ai didi

java - Swing:创建一个 UWP ("Metro")–like 按钮

转载 作者:行者123 更新时间:2023-11-29 06:51:37 26 4
gpt4 key购买 nike

我想设计一个看起来像 UWP 按钮的 Swing 按钮——像这样 [Windows 设置应用程序]: UWP button example

这是我目前所拥有的:

setContentAreaFilled(false)

使用以下代码:

Font f = new Font("Segoe UI", Font.PLAIN, 20);
Color gray = new Color(204, 204, 204);
button.setFont(f);
button.setBackground(gray);
button.setContentAreaFilled(false);
button.setFocusPainted(false);
button.setFocusable(false);
button.setForeground(Color.BLACK);
button.setBorder(BorderFactory.createEmptyBorder(10, 14, 10, 14));

无论 button.setContentAreaFilled(Boolean b); 属性是否设置为 falsetrue,背景颜色根本无法更改,因为 EmptyBorder 继承了 Windows Swing 按钮的默认颜色。

当属性设置为 false 时,悬停(悬停时颜色变化)也会停止运行。

设置 button.setContentAreaFilled(true); 给出了以下结果,这也不理想,因为按钮的背景仍然没有从默认颜色更改(+它有轮廓):

setContentAreaFilled(true)

我的问题基本上是:如何修改我的代码以获得以下类似 UWP 的设计?

默认:

default

悬停:

hovered

最佳答案

有很多方法你“可能”做到这一点,你可以

  • 创建工厂方法以应用模拟功能所需的属性和监听器
  • 创建一个从 JButtonAbstractButton 扩展的新类,并在自包含包中提供您需要的核心功能/属性
  • 您可以提供自己的 UI 委托(delegate),并自定义核心按钮的外观

每种方法都有其优点和缺点,您需要决定哪种方法更能满足您的总体需求。

例如,在现有代码库中提供自定义外观委托(delegate)要容易得多,因为您无需更改代码,只需在需要时安装外观即可

下面是一个使用外观委托(delegate)的例子,这只是一个概念证明,可能还有很多额外的功能/工作需要完成——例如,我想提供更多例如,有关要使用的颜色和翻转边框的厚度的提示

Normal RollOver

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javaapplication24.Test.MetroLookAndFeel;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.plaf.basic.BasicButtonUI;

public class Test {

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

public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setBorder(new EmptyBorder(10, 10, 10, 10));
JButton fancyPB = new JButton("Restart Now");
fancyPB.setUI(new MetroLookAndFeel());

JButton normalPB = new JButton("Restart Now");

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = new Insets(4, 4, 4, 4);

add(fancyPB, gbc);
add(normalPB, gbc);
}

}

public class MetroLookAndFeel extends BasicButtonUI {

// This could be computed properties, where the border color
// is determined based on other properties
private Border focusBorder = new CompoundBorder(new LineBorder(Color.DARK_GRAY, 3), new EmptyBorder(7, 13, 7, 14));
private Border unfocusedBorder = new EmptyBorder(10, 14, 10, 14);

@Override
protected void installDefaults(AbstractButton b) {

super.installDefaults(b);
Font f = new Font("Segoe UI", Font.PLAIN, 20);
Color gray = new Color(204, 204, 204);
b.setFont(f);
b.setBackground(gray);
b.setContentAreaFilled(false);
b.setFocusPainted(false);
// This seems like an oddity...
b.setFocusable(false);
b.setForeground(Color.BLACK);
// b.setBorder(BorderFactory.createEmptyBorder(10, 14, 10, 14));
b.setBorder(unfocusedBorder);
}

@Override
protected void installListeners(AbstractButton b) {
super.installListeners(b);
b.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
((JButton)e.getSource()).setBorder(focusBorder);
}

@Override
public void mouseExited(MouseEvent e) {
((JButton)e.getSource()).setBorder(unfocusedBorder);
}
});
}

}

}

关于java - Swing:创建一个 UWP ("Metro")–like 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46448044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com