java - 你如何从一个按钮关闭的java swing窗口返回一个值?

标签 java swing jframe jbutton

基本上,我的主代码中有某处调用了这行代码

editwindow clubeditwindow = new editwindow(1,"Club Edit");

这一行打开了一个新的 JFrame,基本上可以编辑来自主类的一堆信息。我有 2 个按钮,称为保存和取消。单击保存后,我想从文本字段中获取值,然后将其放入一个新对象并将其返回给主类,然后关闭窗口。单击取消时,我希望它什么也不做,这很简单。

提前致谢。

最佳答案

不要将窗口显示为 JFrame,而是将其显示为模式对话框。然后在它不再可见之后,主 GUI 可以查询该对象以获取它包含的任何信息。最简单的方法是使用 JOptionPane —— 如果使用得当,它们是聪明的小动物。

这是我的意思的一个例子。 JOptionPane 包含使用 GridBagLayout 显示信息的 JPane。

ComplexOptionPane.java:显示主 JFrame。

import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ComplexOptionPane extends JPanel {
   private PlayerEditorPanel playerEditorPanel = new PlayerEditorPanel();
   private JTextArea textArea = new JTextArea(20, 40);

   public ComplexOptionPane() {
      add(new JScrollPane(textArea));
      add(new JButton(new AbstractAction("Get Player Information") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            int result = JOptionPane.showConfirmDialog(null, playerEditorPanel,
                  "Edit Player", JOptionPane.OK_CANCEL_OPTION,
                  JOptionPane.PLAIN_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
               for (PlayerEditorPanel.FieldTitle fieldTitle : 
                  PlayerEditorPanel.FieldTitle.values()) {
                  textArea.append(String.format("%10s: %s%n", fieldTitle.getTitle(),
                        playerEditorPanel.getFieldText(fieldTitle)));
               }
            }
         }
      }));
   }

   private static void createAndShowGui() {
      ComplexOptionPane mainPanel = new ComplexOptionPane();

      JFrame frame = new JFrame("ComplexOptionPane");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

PlayerEditorPanel.java 包含显示在 JOptionPane 中的 JPanel

import java.awt.*;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;

@SuppressWarnings("serial")
class PlayerEditorPanel extends JPanel {
   enum FieldTitle {
      NAME("Name"), SPEED("Speed"), STRENGTH("Strength");
      private String title;

      private FieldTitle(String title) {
         this.title = title;
      }

      public String getTitle() {
         return title;
      }
   };

   private static final Insets WEST_INSETS = new Insets(5, 0, 5, 5);
   private static final Insets EAST_INSETS = new Insets(5, 5, 5, 0);
   private Map<FieldTitle, JTextField> fieldMap = new HashMap<FieldTitle, JTextField>();

   public PlayerEditorPanel() {
      setLayout(new GridBagLayout());
      setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createTitledBorder("Player Editor"),
            BorderFactory.createEmptyBorder(5, 5, 5, 5)));
      GridBagConstraints gbc;
      for (int i = 0; i < FieldTitle.values().length; i++) {
         FieldTitle fieldTitle = FieldTitle.values()[i];
         gbc = createGbc(0, i);
         add(new JLabel(fieldTitle.getTitle() + ":", JLabel.LEFT), gbc);
         gbc = createGbc(1, i);
         JTextField textField = new JTextField(10);
         add(textField, gbc);

         fieldMap.put(fieldTitle, textField);
      }
   }

   private GridBagConstraints createGbc(int x, int y) {
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = x;
      gbc.gridy = y;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;

      gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST;
      gbc.fill = (x == 0) ? GridBagConstraints.BOTH
            : GridBagConstraints.HORIZONTAL;

      gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS;
      gbc.weightx = (x == 0) ? 0.1 : 1.0;
      gbc.weighty = 1.0;
      return gbc;
   }

   public String getFieldText(FieldTitle fieldTitle) {
      return fieldMap.get(fieldTitle).getText();
   }

}

关于java - 你如何从一个按钮关闭的java swing窗口返回一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952442/

相关文章:

Java @FinalArgs 注释 - 如何?

Java:WAITING鼠标输入(单击)

java - Jframe 上的缩放功能?

java - 在图像上绘图

java - 如何捕获 ArrayIndexOutOfBoundsException?

java - Android 构造函数未定义

java - 带有 lambda 表达式的 invokeAndWait 在静态初始值设定项中永远挂起

java - 缓冲键盘输入

java - 取消按钮必须有一个功能

java - 在 JFrame 中居中图像?