1

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

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

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

在此处输入图像描述

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;
}

第二个.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;
}
4

3 回答 3

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;
  }
}
于 2019-01-29T12:54:30.193 回答
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);
    }
}

当然,你可以让它更加面向对象,但我想以一种形式保持简单,这样你就可以看到这一切。

于 2019-01-29T11:09:50.507 回答
0

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

例如

public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
       result = output.getText();
       text.setText(result);
 }
于 2019-01-29T09:59:45.313 回答