通过自定义按钮将数据从JDialog传递到框架

时间:2019-01-29 09:54:06

标签: java swing jbutton jdialog

我是jdialog的新手,我进行了搜索,但似乎找不到使用自定义按钮的解决方案。我发现的唯一解决方案是使用其内置的输入JDialog。但这不能解决我的问题。

我试图将数据(单击“保存”后,从对话框texfield“ hello”传递到父框架textField),但无法这样做。

有人遇到同样的问题吗? 有帮助吗?

enter image description here

public class dataparse {

  String result;
  String inputValue;

public void mainFrame() {
    JFrame frame = new JFrame(" Parent Frame ");
    JPanel center = new JPanel();
    JButton enter = new JButton("Enter");
    // JLabel data = new JLabel("data is...");
    JTextField text = new JTextField();

    frame.setSize(400, 400);
    center.setLayout(new GridLayout(0, 1));
    center.add(text);
    center.add(enter);
    frame.add(center, BorderLayout.CENTER);

    enter.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            confirmDialog();
            text.setText(inputValue);

        }
    });

    frame.setVisible(true);

}


    private void confirmDialog(){
        JTextField output = new JTextField("Hellloooo");
        JButton save = new JButton("Save");


          JDialog customDialog = new JDialog();
          Container pane = customDialog.getContentPane();
          pane.setLayout(new GridLayout(0,1));

          pane.add(new JLabel("Startubg"));
          pane.add(output);
          pane.add(save);

          customDialog.setSize(300,400);

          customDialog.add(output);
          customDialog.add(save);

          customDialog.setVisible(true);

          save.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub
                result = output.getText();
            }
        });

    }

预先感谢您:)

对于一个实例,我有2个类,我希望第二个类从第一个类调用dialog.dispose()。但我无法调用该方法,任何想法

main.java

public JDialog dialogBox(){

    //JDialog dialog = new JDialog(frame, "Date picker", true);
    dialogButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            dialog = new JDialog(frame,"Date picker " , true);
            DatePicker_Demo picker = new DatePicker_Demo();
            dialog.setSize(500, 300);
            dialog.setLayout(new GridLayout(0,2));
            dialog.add(new DatePicker_Demo().addBtn());
            dialog.pack();
            dialog.setVisible(true);
        }
    });
    return dialog;
}

second.java

public JButton addBtn(){
    JButton btn = new AddBills().exitBtn();
    btn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            new AddBills().dialogBox().dispose();
        }
    });

    return btn;
}

3 个答案:

答案 0 :(得分:0)

将text.setText部分放在“保存”按钮的actionListener中有什么问题?

例如

slide

答案 1 :(得分:0)

public class Window extends JFrame {

private JPanel contentPane;
private JTextField txtField;
private JButton btnSave;
private static Window frame2; // making it static so i can work on it from main()
private static int num = 500;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Window frame1 = new Window();
                frame2 = new Window();
                frame1.setVisible(true);
                frame2.setVisible(true);
                frame2.txtField.setText("");// clear the text box of window 2
                frame2.setTitle("window 2");
                frame2.btnSave.setVisible(false); // won't see button on window 2
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Window() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100 + num, 100, 506, 514);
    setTitle("window1");
    num += num; // so you can see both windows
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    txtField = new JTextField();
    txtField.setText("Hello");
    txtField.setBounds(39, 151, 376, 117);
    contentPane.add(txtField);
    txtField.setColumns(10);

    btnSave = new JButton("save");
    btnSave.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            String text = txtField.getText(); // get the text after save button was clicked.
            txtField.setText("");// clear textfield of window 1.
            frame2.txtField.setText(text); // set the text on textField of window 2
            setVisible(true); // update
            frame2.setVisible(true); // update
        }
    });
    btnSave.setBounds(169, 302, 115, 29);
    contentPane.add(btnSave);
    }
}

当然,您可以使它更加面向对象,但我想以一种形式简化它,以便您可以一眼看到。

答案 2 :(得分:0)

您可以像以下示例中那样进行操作。我认为代码中缺少的重要行是setModal(true);

没有setModal(true);行,执行将直接从confirmDialog();转到text.setText(inputValue);,而无需等待用户在对话框中输入文本。

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

public class InputDialogExample {

  public static void main(String[] args) {

    JFrame frame = new JFrame("Frame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JLabel label = new JLabel();

    JButton openDialogButton = new JButton("Open Dialog");
    openDialogButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        CustomDialog dialog = new CustomDialog(frame);
        dialog.setVisible(true);
        label.setText(dialog.getValue());
      }
    });

    frame.getContentPane().setLayout(new GridLayout(2, 1));
    frame.getContentPane().add(label);
    frame.getContentPane().add(openDialogButton);
    frame.setBounds(300, 200, 400, 300);
    frame.setVisible(true);
  }
}

class CustomDialog extends JDialog {

  private String value;

  CustomDialog(Frame owner) {

    super(owner, "Dialog");

    setModal(true); // This is the important line

    JTextField textField = new JTextField();

    JButton okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        value = textField.getText();
        setVisible(false);
      }
    });

    getContentPane().setLayout(new GridLayout(2, 1));
    getContentPane().add(textField);
    getContentPane().add(okButton);
    setBounds(500, 400, 300, 200);
  }

  String getValue() {
    return value;
  }
}