为什么FlatLaf变换主题之后会有一个多出来的边框
原来没有边框:

切换主题之后就有了边框:

AI已经检查:
在上述代码中,大部分组件都已设置了无边框或透明边框,以实现无边框效果。以下是具体说明:
JFrame:作为主窗口,没有直接设置无边框,但通过this.setExtendedState(JFrame.MAXIMIZED_BOTH);将其最大化显示,通常最大化后会隐藏窗口边框。
JToolBar(left):通过left.setBorder(null);移除了边框。
JButton(lf1、lf2):使用FlatButton自定义按钮,并移除边框和焦点绘制
JPanel(panel、contanier、mainPanel):均通过setBorder(null)或setOpaque(false)移除了边框或使其背景透明,从而达到无边框效果。
JScrollPane(scrollPane):通过scrollPane.setBorder(null);移除了边框,并且setOpaque(false)使其背景透明。同时设置了垂直滚动条始终显示且滚动单位增量。
JMenuBar(menuBar):未直接设置无边框,但在FlatLaf主题下,菜单栏通常会遵循主题样式,可能已经实现了无边框效果。若需要进一步确保无边框,可能需要查阅FlatLaf文档或源码,针对JMenuBar进行特定设置。
相关组件:
private void CreateCenterCompoment() {
panel = new JPanel(new GridBagLayout());
contanier = new JPanel(new CardLayout());
// 创建面板并设置颜色
JPanel panel1 = new JPanel();
panel1.setBackground(Color.RED);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.GREEN);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.BLUE);
JPanel panel4 = new JPanel();
panel4.setBackground(Color.YELLOW);
// 添加面板到主面板
GridBagConstraints gbc = new GridBagConstraints();
// 设置面板填充整个单元格,并添加间距
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(0, 0, 5, 5); // 间距设置为 10
// 第一行第一个面板占满一行两列
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2; // 占两列
gbc.weightx = 1.0; // 横向扩展比例
gbc.weighty = 1.0; // 纵向扩展比例
panel.add(panel1, gbc);
// 第一行第三列再放一个面板占两行一列
gbc.gridx = 2;
gbc.gridy = 0;
gbc.gridheight = 2; // 占两行
gbc.gridwidth = 1; // 占一列
panel.add(panel2, gbc);
// 第二行第一个面板
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridheight = 1; // 重置为默认值
panel.add(panel3, gbc);
// 第二行第二个面板
gbc.gridx = 1;
panel.add(panel4, gbc);
setLocationRelativeTo(null);
LoadImage();
panel.setBorder(null);
contanier.setBorder(null);
contanier.setOpaque(false);
contanier.add(panel,"card1");
contanier.add(scrollPane, "card2");
this.add(contanier,BorderLayout.CENTER);
}
private void LoadImage() {
mainPanel = new JPanel();
mainPanel.setBorder(null);
mainPanel.setOpaque(false);
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
scrollPane = new JScrollPane(mainPanel);
scrollPane.setBorder(null);
scrollPane.setOpaque(false);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.getVerticalScrollBar().setUnitIncrement(15);
getContentPane().add(scrollPane);
实现切换的代码
if (dark != darkTheme) { // 如果要切换的主题与当前主题不同
darkTheme = dark; // 更新主题标志
if (dark) {
EventQueue.invokeLater(() -> {
FlatAnimatedLafChange.showSnapshot();
MyDarkerLaf.setup();
FlatLaf.updateUI();
FlatAnimatedLafChange.hideSnapshotWithAnimation();
});
} else {
EventQueue.invokeLater(() -> {
FlatAnimatedLafChange.showSnapshot();
MyLightLaf.setup();
FlatLaf.updateUI();
FlatAnimatedLafChange.hideSnapshotWithAnimation();
});
}
}