gpt4 book ai didi

java - 单击按钮的 JDialog Action 监听器

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:16 26 4
gpt4 key购买 nike

我有主要应用程序,其中包含值的表。然后,我单击“添加”按钮,出现新的 CUSTOM(我自己制作的)JDialog 类型弹出窗口。我可以在那里输入值,打勾并单击“确认”。所以我需要从对话框中读取该输入,这样我就可以将这个值添加到主应用程序的表中。我如何在按下“确认”按钮时收听,以便我可以在之后读取该值?

addISDialog = new AddISDialog();
addISDialog.setVisible(true);
addISDialog.setLocationRelativeTo(null);
//somekind of listener...
//after "Confirm" button in dialog was pressed, get value
value = addISDialog.ISName;

最佳答案

如果对话框在用户按下确认后消失:

  • 并且您希望让对话框表现为模态 JDialog,那么这很容易,因为您知道只要用户输入您的程序在代码中的位置已完成对话框的处理——在您调用对话框上的 setVisible(true) 之后它会立即生效。因此,您只需在对话框上调用 setVisible(true) 后立即在代码行中查询对话框对象的状态。
  • 如果您需要处理非模态对话框,则需要向对话框添加一个 WindowListener,以便在对话框的窗口变得不可见时收到通知。

如果对话框在用户按下确认后保持打开状态:

  • 那么您应该按照上面的建议使用 PropertyChangeListener。或者为对话框对象提供一个公共(public)方法,允许外部类能够将 ActionListener 添加到确认按钮。

有关更多详细信息,请向我们展示您的代码的相关部分,或者更好的是,sscce .

例如,要允许 JDialog 类接受外部监听器,您可以给它一个 JTextField 和一个 JButton:

class MyDialog extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");

以及允许外部类向按钮添加 ActionListener 的方法:

public void addConfirmListener(ActionListener listener) {
confirmBtn.addActionListener(listener);
}

然后外部类可以简单地调用 `addConfirmListener(...) 方法将其 ActionListener 添加到 confirmBtn。

例如:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class OutsideListener extends JFrame {
private JTextField textField = new JTextField(10);
private JButton showDialogBtn = new JButton("Show Dialog");
private MyDialog myDialog = new MyDialog(this, "My Dialog");

public OutsideListener(String title) {
super(title);
textField.setEditable(false);

showDialogBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!myDialog.isVisible()) {
myDialog.setVisible(true);
}
}
});

// !! add a listener to the dialog's button
myDialog.addConfirmListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = myDialog.getTextFieldText();
textField.setText(text);
}
});

JPanel panel = new JPanel();
panel.add(textField);
panel.add(showDialogBtn);

add(panel);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}

private static void createAndShowGui() {
JFrame frame = new OutsideListener("OutsideListener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

class MyDialog extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");

public MyDialog(JFrame frame, String title) {
super(frame, title, false);
JPanel panel = new JPanel();
panel.add(textfield);
panel.add(confirmBtn);

add(panel);
pack();
setLocationRelativeTo(frame);
}

public String getTextFieldText() {
return textfield.getText();
}

public void addConfirmListener(ActionListener listener) {
confirmBtn.addActionListener(listener);
}
}

注意事项:除非绝对必要,否则我不建议子类化 JFrame 或 JDialog。只是为了简洁起见,在这里完成。我自己也更喜欢使用模态对话框来解决这个问题,并在需要时重新打开对话框。

编辑2
模态对话框的使用示例:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class OutsideListener2 extends JFrame {
private JTextField textField = new JTextField(10);
private JButton showDialogBtn = new JButton("Show Dialog");
private MyDialog2 myDialog = new MyDialog2(this, "My Dialog");

public OutsideListener2(String title) {
super(title);
textField.setEditable(false);

showDialogBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if (!myDialog.isVisible()) {
myDialog.setVisible(true);

textField.setText(myDialog.getTextFieldText());
}
}
});

JPanel panel = new JPanel();
panel.add(textField);
panel.add(showDialogBtn);

add(panel);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}

private static void createAndShowGui() {
JFrame frame = new OutsideListener2("OutsideListener");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

class MyDialog2 extends JDialog {
private JTextField textfield = new JTextField(10);
private JButton confirmBtn = new JButton("Confirm");

public MyDialog2(JFrame frame, String title) {
super(frame, title, true); // !!!!! made into a modal dialog
JPanel panel = new JPanel();
panel.add(new JLabel("Please enter a number between 1 and 100:"));
panel.add(textfield);
panel.add(confirmBtn);

add(panel);
pack();
setLocationRelativeTo(frame);

ActionListener confirmListener = new ConfirmListener();
confirmBtn.addActionListener(confirmListener); // add listener
textfield.addActionListener(confirmListener );
}

public String getTextFieldText() {
return textfield.getText();
}

private class ConfirmListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String text = textfield.getText();
if (isTextValid(text)) {
MyDialog2.this.setVisible(false);
} else {
// show warning
String warning = "Data entered, \"" + text +
"\", is invalid. Please enter a number between 1 and 100";
JOptionPane.showMessageDialog(confirmBtn,
warning,
"Invalid Input", JOptionPane.ERROR_MESSAGE);
textfield.setText("");
textfield.requestFocusInWindow();
}
}
}

// true if data is a number between 1 and 100
public boolean isTextValid(String text) {
try {
int number = Integer.parseInt(text);
if (number > 0 && number <= 100) {
return true;
}
} catch (NumberFormatException e) {
// one of the few times it's OK to ignore an exception
}
return false;
}

}

关于java - 单击按钮的 JDialog Action 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8523471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com