Java UIManager处于按钮操作状态

Java UIManager处于按钮操作状态,java,paint,joptionpane,uimanager,Java,Paint,Joptionpane,Uimanager,我有一个LoginScreen和一个main窗口。当数据库连接尝试成功时,LoginScreendisposed和Main窗口出现 我有一个按钮有ActionListener,用于创建JOptionPane。代码实际上成功地工作了。我想我在绘画方面有三个问题。让我逐一解释问题 问题1 UIManager UI=new UIManager(); Object paneBG = UI.get("OptionPane.background"); Object panelBG = UI.get("Pan

我有一个
LoginScreen
和一个
main窗口
。当数据库连接尝试成功时,LoginScreen
disposed
和Main窗口出现

我有一个按钮有
ActionListener
,用于创建
JOptionPane
。代码实际上成功地工作了。我想我在绘画方面有三个问题。让我逐一解释问题

问题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);
我使用上述代码更改
选项窗格
背景色
,向用户显示并将UI颜色回滚为原始颜色

如果我直接运行
main窗口
并单击按钮,颜色会发生变化(确保面板和按钮区域在OptionPane中保持原始颜色,但其他OptionPane区域会变为红色。这是另一个问题),如下所示

但当我从
LoginScreen
登录时,登录尝试成功,LoginScreen
已处理
并出现主窗口。我点击同一个按钮,但是现在没有画,像这样

问题2

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);
我在主窗口中有另一个按钮,它创建了另一个选项窗格。我直接运行主窗口,单击第一个按钮(它更改了UI颜色和回滚操作),关闭它,然后单击第二个按钮(它有另一个选项面板)选项窗格(仍然绘制),这样UI颜色就不会回滚到默认值

问题3

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

如果我们解决了第一个和第二个问题,我如何使
透明
这些内部面板(有标签和文本字段面板一个和按钮一个)

首先,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;
}

您需要小心区分消息类型参数和选项类型参数。将信息消息和普通消息作为参数传递是不正确的。声明第四和第五个参数分别是选项类型和消息类型;选项类型参数应为默认选项、确定取消选项、是否选项等。

如果重复使用同一对话框,为什么不创建自定义的
JDialog
?因为我需要为JDialog中的每个按钮编写ActionListener。我认为OptionPane很容易使用。实际上,我需要在选项窗格上绘制渐变。如果我不能解决这些问题,我会求助于JDialog,然后发布一个。请确保将您的代码复制粘贴到新项目中,并确保在将其发布到此处之前编译并运行。既然您请求“输入”,为什么要使用“showOptionDialog”而不是“showInputDialog”?此示例非常有指导性和帮助性。我还可以在这个示例中添加一些东西,以便使用GradientPaint绘制OptionPane。