在运行时更改 JOptionPane 上的按钮文本

问题描述 投票:0回答:1

我想在运行时使用 JCheckBox 的 ActionListener 根据选择状态更改“确定”按钮的文本(自定义按钮文本)。我不想创建自己的 JDialog 或 JFrame。

我有一个 JPanel 并将 JCheckBox 添加到这个 JPanel 中。之后,我将 JPanel 添加到 JOptionpane。

由于我无法直接访问该按钮,因此我尝试找到该按钮。 下面你可以看到我已经尝试过的。

    JPanel myPanel = new JPanel();

    GridBagLayout gbl = new GridBagLayout();
    GridBagConstraints gbc = new GridBagConstraints();  
    myPanel.setLayout(gbl);

    // other components removed 

    JCheckBox chkboxCreateNew = new JCheckBox();
        gbc.fill = GridBagConstraints.HORIZONTAL;  
        gbc.ipady = 10;  
        gbc.gridx = 0;  
        gbc.gridy = 12;
        
        chkboxCreateNew.addActionListener(
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        
                        Window[] windows = Window.getWindows();
                        for (Window window : windows) {
                            if (window instanceof JDialog) {
                                for(Component c : window.getComponents()) {
                                    System.out.println("(window instanceof JDialog) Component: " + c.getClass());
                                    if(c instanceof JButton) {
                                        System.out.println("JButton found " + c.getName());
                                    }
                                }
                                
                                JDialog dialog = (JDialog) window;
                                
                                Component[] components = dialog.getContentPane().getComponents();
                                for (Component component : components) {
                                    System.out.println("(Component component) Component: " + component.getClass());
                                    if (component instanceof JButton) {
                                        JButton button = (JButton) component;
                                        if (button.getText().equals("Update")) {
                                            if (chkboxCreateNew.isSelected()) {
                                                button.setText("yyy");
                                            } else {
                                                button.setText("Test");
                                            }
                                            break;
                                        }
                                    }
                                }
                                
                                System.out.println("(JDialog) Component Count: " + dialog.getContentPane().getComponentCount());
                                if (dialog.getContentPane().getComponentCount() == 1
                                    && dialog.getContentPane().getComponent(0) instanceof JOptionPane){
                                    System.out.println("(JDialog) Component: " + dialog.getClass());
                                }
                            }
                        }

                        for(Component c : chkboxCreateNew.getParent().getParent().getParent().getComponents()) {
                            System.out.println("(Parent) Component: " + c.getClass() + " Name: " + c.getName());
                            if(c instanceof JButton) {
                                System.out.println("JButton " + c.getName());
                            }
                        }
                        
                        if(chkboxCreateNew.isSelected()) {
                            // nothing at the moment
                        } else {

                        }
                    }
                }
            );
        chkboxCreateNew.setText("Text");
        myPanel.add(chkboxCreateNew, gbc);
        
        // okButtonText
        Object[] options2 = {okButtonText, cancelButtonText};
        int result = JOptionPane.showOptionDialog(null,
                myPanel,
                "Name",
                JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,         
                options2,     //the titles of buttons
                options2[0]); //default button title

有什么想法吗?或者是制作我自己的 JDialog 的唯一选择?

java joptionpane jcheckbox
1个回答
0
投票

大多数时候,我们通过调用 JOptionPane 的静态方法之一来使用 JOptionPane,就像调用 JOptionPane.showOptionDialog 时所做的那样。然而,JOptionPane 实际上是 JComponent 的子类,具有自己的非静态方法和属性。当调用静态方法时,它会创建一个实际的 JOptionPane 实例,调用该对象的 createDialog 方法,并显示该 JDialog。

这意味着当您调用 JOptionPane.showOptionDialog 时,

myPanel
有一个 JOptionPane 祖先。

您可以访问该 JOptionPane 对象并更改其属性:

chkboxCreateNew.addActionListener(e -> {
    JOptionPane optionPane = (JOptionPane)
        SwingUtilities.getAncestorOfClass(JOptionPane.class, myPanel);

    String okButtonText = chkboxCreateNew.isSelected() ? "yyy" : "Test";
    String cancelButtonText = "cancel";
    Object[] newOptions = { okButtonText, cancelButtonText };

    optionPane.setOptions(newOptions);
    optionPane.setInitialValue(newOptions[0]);
});
© www.soinside.com 2019 - 2024. All rights reserved.