Java swing: 当我在JOptionPane中改变我的背景颜色时如何解决这个问题?

Java swing: How to solve this problem when I change my background color in JOptionPane?

  1. 更改 JOptionPane 的背景颜色时,无法如图所示更改文本的背景颜色?!

存在问题的图片


  1. 还有,如何更改确定按钮的背景颜色和字体颜色??

注意:我已经尝试了很多解决方案,但其中 none 有效。

这是代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {  
    UIManager.put("OptionPane.buttonFont", new Font("Arial", PLAIN, 30));
    JOptionPane pane = new JOptionPane("<html><b style=\"color:RED; font-size:20px;\">login successful</b></html>", 
    JOptionPane.INFORMATION_MESSAGE, 
    JOptionPane.DEFAULT_OPTION,         
    ChangeIconJoptionPane("/photo/icons8_Done_70px.png", 60, 60));

    getComponents(pane);
    pane.setBackground(new Color(32, 139, 223));
    JDialog jd = pane.createDialog(this, "Success");
    jd.setVisible(true);
}

JOptionPane 由许多组件组成。您需要为所有这些设置背景。

下面是遍历整个组件树的简单方法:

private static Stream<Component> walk(Component root) {
    Stream<Component> stream = Stream.of(root);

    if (root instanceof Container) {
        Component[] children = ((Container) root).getComponents();
        stream = Stream.concat(
            Arrays.stream(children).flatMap(c -> walk(c)), stream);
    }

    return stream;
}

private void jButton1ActionPerformed(ActionEvent evt) {
    JOptionPane pane = new JOptionPane(
        "<html><b style=\"color:RED; font-size:20px;\">login successful</b></html>", 
        JOptionPane.INFORMATION_MESSAGE, 
        JOptionPane.DEFAULT_OPTION,         
        ChangeIconJoptionPane("/photo/icons8_Done_70px.png", 60, 60));

    Color background = new Color(32, 139, 223);
    walk(pane).forEach(c -> c.setBackground(background));
}

但是... 在某些 look-and-feels 中,无法更改 JButton 的背景颜色。 Windows 和 Mac 的系统 look-and-feels 将忽略 JButton 的背景 属性,并始终使用系统设置呈现按钮。

自定义确定按钮最可靠的方法是自己创建按钮,并将其作为选项值传递给 JOptionPane:

private void jButton1ActionPerformed(ActionEvent evt) {
    JButton okButton = new JButton("OK");

    Font font = okButton.getFont();
    font = font.deriveFont(font.getSize2D() * 1.5f);
    okButton.setFont(font);

    JOptionPane pane = new JOptionPane(
        "<html><b style=\"color:RED; font-size:20px;\">login successful</b></html>", 
        JOptionPane.INFORMATION_MESSAGE, 
        JOptionPane.DEFAULT_OPTION,         
        ChangeIconJoptionPane("/photo/icons8_Done_70px.png", 60, 60),
        new Object[] { okButton });

    okButton.addActionListener(e -> pane.setValue(JOptionPane.OK_OPTION));

    Color background = new Color(32, 139, 223);
    walk(pane).forEach(c -> c.setBackground(background));
}