如果對話框將在用戶按下後消失確認:
- ,你希望擁有的對話框表現爲一個模式的JDialog,那麼它很容易,因爲你知道在哪裏只要用戶完成對話框,程序就會執行代碼 - 在對話框中調用
setVisible(true)
後就會立即生效。因此,在對話框中調用setVisible(true)
之後,您只需立即在代碼行中查詢對話框對象的狀態。
- 如果你需要處理一個非模態對話框,那麼你需要添加一個WindowListener到對話框的窗口變得不可見時通知的對話框。
如果對話框是保持開放後,用戶按下確認:
- 那麼你應該使用一個PropertyChangeListener如上面已經建議。或者給對話對象一個公共方法,允許外部類將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;
}
}
我實現監聽器裏的JDialog,我可以聽那個對話框內按鈕,但我需要聽那個按鈕之外對話 - 在主應用程序,在那裏我稱之爲該對話框 – 2011-12-15 16:45:50
您可以編輯`JDialog`類?如果是這樣,你可以將`ActionEvent`轉發給另一個實現`ActionListener`接口的類,並且這個類可以做你想做的事。 – mre 2011-12-15 16:47:17
我做AddISDialog自己(公共類AddISDialog擴展的JDialog實現的ActionListener)所以是的,我可以對其進行編輯。你是什麼意思轉發ActionEvent到另一個類?我該怎麼做? – 2011-12-15 16:51:09