【问题标题】:UIManager in Button Action按钮操作中的 UIManager
【发布时间】:2016-01-19 15:55:48
【问题描述】:

我有一个LoginScreen 和一个MainWindow。连接DB成功后,会出现LoginScreendisposed和MainWindow。

我有一个按钮有ActionListener 用于创建JOptionPane。代码实际成功运行。我认为Painting 有三个问题。让我一一解释问题;

问题 1;

UIManager UI=new UIManager();
Object paneBG = UI.get("OptionPane.background");
Object panelBG = UI.get("Panel.background");
UI.put("OptionPane.background", Color.red);
UI.put("Panel.background", Color.red);

String[] buttons2 = { "EXIT", "OK" };
int rc2 = JOptionPane.showOptionDialog(MainWindow.this, 
                                        panel,
                                        "User Input", 
                                        JOptionPane.INFORMATION_MESSAGE,
                                        JOptionPane.PLAIN_MESSAGE, 
                                        icon, 
                                        buttons2, 
                                        buttons2[1]
                                      );

UI.put("OptionPane.background", paneBG);
UI.put("Panel.background", panelBG);

我使用上述代码更改background colorOptionPane,显示给用户并将UI 颜色回滚为原始颜色。

如果我直接运行MainWindow 并单击按钮,颜色会改变(确保面板和按钮区域在 OptionPane 中保持原始颜色,但其他 OptionPane 区域变为红色。这是另一个问题)像这样;

但是当我来自LoginScreen 时,登录尝试成功,LoginScreen disposed 和 MainWindow 出现。我点击了同一个按钮,但OptionPane 现在没有画,像这样;

问题 2;

我在 MainWindow 中有另一个按钮,它创建了另一个 OptionPane。我直接运行 MainWindow 并单击第一个按钮(它具有更改 UI 颜色和回滚操作),关闭它而不是单击第二个按钮(具有另一个 OptinPane) OptionPane 仍然绘制,因此 UI 颜色不会回滚到默认值。

问题 3;

如果我们解决了第一个和第二个问题,我该如何制作transparent 这些内部面板(其中有一个标签和文本字段面板和一个按钮)

【问题讨论】:

  • 如果你重复使用同一个对话框,为什么不创建一个自定义的JDialog
  • 因为我需要为 JDialog 中的每个按钮编写 ActionListener。我认为 OptionPane 易于使用。实际上我需要对 OptionPanes 进行渐变绘画。如果我不能解决这些问题,我会求助于 JDialog。
  • 然后发布MCVE。请务必将您的代码复制粘贴到新项目,并确保在将其发布到此处之前编译并运行。
  • 既然您要求“输入”,为什么要使用“showOptionDialog”而不是“showInputDialog”?

标签: java paint joptionpane uimanager


【解决方案1】:

首先,UIManager 的公共方法是静态的。创建 UIManager 的实例是不正确、具有误导性和毫无意义的。调用这些方法的正确方法是:

UIManager.put("OptionPane.background", Color.red);

其次,您可能不应该使用全局设置来更改颜色,尤其是动态更改。相反,通过创建 JOptionPane 的实际实例而不是使用静态便捷方法来设置相关对象的颜色:

static void setBackground(Component c,
                          Color color) {
    if (c instanceof JTextField || c instanceof AbstractButton) {
        return;
    }

    c.setBackground(color);
    if (c instanceof Container) {
        Component[] children = ((Container) c).getComponents();
        for (Component child : children) {
            setBackground(child, color);
        }
    }
}

int show(Icon icon,
         JComponent panel) {

    String[] buttons2 = { "EXIT", "OK" };
    JOptionPane optionPane = new JOptionPane(panel,
                                             JOptionPane.PLAIN_MESSAGE, 
                                             JOptionPane.DEFAULT_OPTION,
                                             icon, 
                                             buttons2, 
                                             buttons2[1]);
    setBackground(optionPane, Color.RED);

    optionPane.createDialog(MainWindow.this, "User Input").setVisible(true);

    Object value = optionPane.getValue();
    int rc2 = JOptionPane.CLOSED_OPTION;
    if (value instanceof String) {
        rc2 = Arrays.asList(buttons2).indexOf(value);
    }

    return rc2;
}

您要小心区分 消息类型 参数和 选项类型 参数。同时传递 INFORMATION_MESSAGE 和 PLAIN_MESSAGE 作为参数是不正确的。 documentation 声明第四个和第五个参数分别是选项类型和消息类型;选项类型参数应为 DEFAULT_OPTION、OK_CANCEL_OPTION、YES_NO_OPTION 等。

【讨论】:

  • 这个例子很有指导意义和帮助。我也可以在这个例子中添加一些东西,用我认为的 GradientPaint 绘制 OptionPane。
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多