当我通过UIManager.setLookAndFeel
设置外观时,框架的内容会按预期更改其外观。 E.g。
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("Some Button"));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(200, 80);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
但框架仍然使用操作系统默认设置(在我的情况下为Windows)。
如何使框架外观和感觉清晰,使其看起来像灵气的外观和感觉?
通常使用ComponentUI
来实现外观,但JFrame
不是JComponent
,因此我无法实现自己的ComponentUI
和{{3}它。
我的第一个想法是使用一个以set为主要成分的未修饰JFrame
。
public class LAFAwareJFrame extends JFrame {
private JInternalFrame lafFrame = new JInternalFrame("", true, true, true, true);
private JDesktopPane desktopPane = new JDesktopPane();
public LAFAwareJFrame() {
super.setUndecorated(true);
desktopPane.add(lafFrame);
lafFrame.setVisible(true);
Container contentPane = super.getContentPane();
contentPane.add(desktopPane);
}
@Override
public void setUndecorated(boolean undecorated) {
throw new UnsupportedOperationException("Can't change the undecorated property for a LAFAwareJFrame");
}
@Override
public void setSize(int width, int height) {
super.setSize(width, height);
lafFrame.setSize(width, height);
}
@Override
public Container getContentPane() {
return lafFrame.getContentPane();
}
@Override
public void setTitle(String title) {
lafFrame.setTitle(title);
}
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
JFrame frame = new LAFAwareJFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(new JButton("Some Button"));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(200, 80);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
但后来我与事件处理和委派有很多关系。例如,当JInternalFrame
被移动时,我真的不想移动内部框架。相反,我想移动未装饰的框架。
仅将JInternalFrame
用作渲染器。就像ListCellRender
。
由于所有解决方案都需要大量工作,我想先问你是否有更好的解决方案。例如。一个库或者它已经可以使用标准Java而且我错过了一些东西。
修改
我尝试使用JInternalFrame
但它不适用于nimbus而不适用于motif。