2301_78804227 2024-04-20 17:08 采纳率: 57.1%
浏览 69

FlatLaf换主题后多出边框

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

img


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

img


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();
                });
            }
        }

  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-04-22 01:28
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:
    根据描述,主题切换后出现了多余的边框,但在代码中已经尽可能地移除了组件的边框或使其透明。可能的原因是在主题切换时,一些组件的边框样式并没有被正确地更新,导致了多余的边框出现。解决方案需要对主题切换的逻辑进行检查,并确保所有相关的组件都正确地更新了样式。
    解决方案:

    1. 检查主题切换逻辑:首先需要确保主题切换的逻辑没有问题,即在切换主题时,所有需要更新样式的组件都被正确地处理了。
    2. 更新主题时重新设置组件样式:在主题切换的代码块中,对所有可能受到主题影响的组件进行检查,并重新设置它们的样式,确保适应新的主题。
    3. 查阅FlatLaf文档或源码:如果以上步骤无法解决问题,可能需要查阅FlatLaf的文档或源码,了解主题切换时应该如何正确地更新组件样式,特别是针对JMenuBar这样的特定组件。
    4. 细致排查可能遗漏的边框设置:重新审查代码,确保所有可能影响边框的地方都被正确处理,包括对JMenuBar的特殊处理。
    5. 若仍无法解决,考虑添加调试信息:在主题切换的代码块中添加一些调试信息,输出相关组件的边框状态或样式信息,以便进一步排查问题所在。
      代码修改建议:
      根据问题描述,需要对主题切换时重新设置组件样式的部分进行修改。在切换主题时,对所有可能受到影响的组件进行重新设置样式,确保其适应新的主题。以下是可能需要修改的代码部分:
      javaCopy code
      // 在主题切换的代码块中重新设置组件样式
      if (dark != darkTheme) {
      // 如果要切换的主题与当前主题不同
      darkTheme = dark; // 更新主题标志
      if (dark) {
      EventQueue.invokeLater(() -> {
      FlatAnimatedLafChange.showSnapshot();
      MyDarkerLaf.setup();
      // 对所有可能受到影响的组件重新设置样式
      // 例如:
      panel.setBorder(null);
      contanier.setBorder(null);
      // 其他受影响的组件样式设置
      FlatLaf.updateUI();
      FlatAnimatedLafChange.hideSnapshotWithAnimation();
      });
      } else {
      EventQueue.invokeLater(() -> {
      FlatAnimatedLafChange.showSnapshot();
      MyLightLaf.setup();
      // 对所有可能受到影响的组件重新设置样式
      // 例如:
      panel.setBorder(null);
      contanier.setBorder(null);
      // 其他受影响的组件样式设置
      FlatLaf.updateUI();
      FlatAnimatedLafChange.hideSnapshotWithAnimation();
      });
      }
      }
      
      根据具体情况,可能还需要进一步调整代码以确保所有受影响的组件都得到正确的样式更新。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 修改了问题 4月20日
  • 创建了问题 4月20日