1. 主题文件
package io.bbn.openmap.app;
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.metal.MetalLookAndFeel;
public class MyCustomLookAndFeel extends MetalLookAndFeel {
@Override
public String getName() {
return "My Custom Look and Feel";
}
@Override
public String getID() {
return "MyCustomLookAndFeel";
}
@Override
public boolean isNativeLookAndFeel() {
return false;
}
@Override
public boolean isSupportedLookAndFeel() {
return true;
}
@Override
public UIDefaults getDefaults() {
UIDefaults defaults = super.getDefaults();
defaults.put("Panel.background", new Color(200, 200, 200));
defaults.put("Button.background", new Color(100, 100, 100));
defaults.put("Button.foreground", Color.WHITE);
defaults.put("Button.font", new Font("Serif", Font.BOLD, 18));
defaults.put("Button.border", BorderFactory.createLineBorder(Color.BLACK));
return defaults;
}
}
2. 测试文件
package io.bbn.openmap.app;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CustomLookAndFeelDemo {
public static void main(String[] args) {
try {
UIManager.installLookAndFeel("MyCustomLookAndFeel", MyCustomLookAndFeel.class.getName());
UIManager.setLookAndFeel(new MyCustomLookAndFeel());
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Custom Look and Feel Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
JButton button = new JButton("Click Me!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked!");
}
});
frame.getContentPane().add(button);
frame.setVisible(true);
});
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
System.err.println("Custom LookAndFeel is not supported: " + e.getMessage());
}
}
}