Pertanyaan Membuat perintah Java Swing Swing kustom


Masalah ini terpecahkan.

Saya sedang mengembangkan Java Swing berbasis diproyeksikan, dan tampilan & nuansa aplikasi sepenuhnya disesuaikan. Kami mencoba mempertahankan tampilan yang konsisten di seluruh program, dan jendela dialog Java default tidak sama.

Masalah saat ini memerlukan panggilan pemblokiran kontrol ke prompt pengguna. Serupa dengan JOptionPane.showConfirmDialog () Dalam hal ini, panggilan statis menghasilkan jendela, dan menghentikan aliran program sampai pengguna memilih opsi. Ini juga mengembalikan nilai opsi. Perhatikan bahwa GUI itu sendiri tidak terkunci secara logis, tetapi pengguna tidak dapat berinteraksi dengan sisanya.

int n = JOptionPane.showConfirmDialog(this,
    "Are you sure?",
    "Confirm"
    JOptionPane.YES_NO_OPTION);

Saya ingin menduplikasi fungsi ini dengan tampilan yang disesuaikan, dan menggunakan string. Idealnya, kode saya akan muncul sebagai berikut:

String result = CustomPrompt.showPrompt(this,
    "Please enter your name", //Text
    "Prompt.",                //Title
    "John Smith");            //Default

Ini biasanya akan digunakan untuk masukan kata sandi, dan saya memahami jenis kembalinya kata sandi berbeda, tetapi ini adalah contoh. Ini dapat dicapai dengan menggunakan serangkaian pendengar tombol dan acara, di beberapa kelas, tetapi pembacaan kode dan keandalan aplikasi berkurang.

Frame akan dibangun melalui NetBeans dan dikustomisasi dari sana. Saya mengerti bahwa prompt seperti itu sudah ada di Swing, tetapi tampilan & nuansa benar-benar berbeda.

Pertanyaannya diringkas: Cara menggunakan bingkai yang disesuaikan untuk meminta pengguna agar memasukkan dengan cara memblokir.

Solusi untuk masalah ini adalah sebagai berikut:

public class PromptForm extends JDialog
{
    transient char[] result;

    public char[] getResult()
    {
        return result;
    }
    public PromptForm(Frame parent)
    {
        super(parent, true);
        initComponents();
    }
    public void prompt()
    {
        this.setVisible(true);
    }
    public static char[] promptForPassword(Frame parent)
    {
        PromptForm pf = new PromptForm(parent);
        pf.prompt();
        return pf.getResult();
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    {
        result = jPasswordField1.getPassword();
        setVisible(false);
        dispose();
    }
    private void initComponents() {...}

    private javax.swing.JButton jButton1;
    private javax.swing.JPasswordField jPasswordField1;
}

Dipanggil oleh:

    char [] ret = PromptForm.promptForPassword(this);
    JOptionPane.showMessageDialog(this, new String(ret), "Neat", JOptionPane.QUESTION_MESSAGE);

6
2018-02-01 16:24


asal


Jawaban:


Membuat CustomPrompt meluas JDialog, memiliki panggilan konstruktor super melewati pemiliknya Window dan yang diinginkan ModalityType.

public class CustomPrompt extends JDialog {

  public static String showPrompt(Window parent, String title, String text, 
         String defaultText) {
    final CustomPrompt prompt = new CustomPrompt(parent);
    prompt.setTitle(title);
    // set other components text
    prompt.setVisible(true);

    return prompt.textField.getText();
  }

  private JTextField textField;

  // private if you only want this prompt to be accessible via constructor methods
  private CustomPrompt(Window parent) {
    super(parent, Dialog.DEFAULT_MODALITY_TYPE); 
    // Java >= 6, else user super(Frame, true) or super(Dialog, true);
    initComponents(); // like Netbeans
  }

  // initComponents() and irrelevant code. 
}

5
2018-02-01 16:30