我想在运行时使用 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 的唯一选择?
大多数时候,我们通过调用 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]);
});