0

次のコードを見てください

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;

public class SendEmailForm extends JDialog {

    private JLabel to, cc, bcc, subject, account;
    private JTextField toTxt, ccTxt, bccTxt, subjectTxt;
    private JTextArea messageTxt;
    private JButton send;
    private JComboBox accountBox;
    private JScrollPane scroll;
    private GridBagLayout gbl;
    private GridBagConstraints gbc;

    public SendEmailForm() {
        //Declaring instance variables
        to = new JLabel("To: ");
        cc = new JLabel("CC: ");
        bcc = new JLabel("BCC: ");
        subject = new JLabel("Subject: ");
        account = new JLabel("Select an Account: ");

        toTxt = new JTextField(20);
        ccTxt = new JTextField(20);
        bccTxt = new JTextField(20);
        subjectTxt = new JTextField(20);

        messageTxt = new JTextArea(20, 50);
        messageTxt.setLineWrap(true);
        scroll = new JScrollPane(messageTxt);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        accountBox = new JComboBox();
        accountBox.addItem("Yahoo");
        accountBox.addItem("GMail");
        accountBox.addItem("MSN");
        //accountBox.addItem("Yahoo");
        //accountBox.addItem("Yahoo");

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout());

        send = new JButton("Send");
        send.addActionListener(new SendButtonAction());
        buttonPanel.add(send);

        //Creating thr GUI
        //GUI CREATION IS REMOVED IN THIS POST

        this.setTitle("Send Emails");
        this.setVisible(true);
        this.pack();
        this.setLocationRelativeTo(null);
        this.validate();
    }

    private class SendButtonAction implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            ProgressMonitor pm = new ProgressMonitor();
            //Retreiving the user name and password
            List userData = new ArrayList();

            EmailDBConnector emailCon = new EmailDBHandler();
            userData = emailCon.getUserNameAndPassword(
                    accountBox.getSelectedItem().toString().trim());

            String userName = userData.get(0).toString();
            String password = userData.get(1).toString();
            System.out.println(userName);
            System.out.println(password);

            pm.setVisible(true);

            SendEmail sendEmail = new SendEmail(toTxt.getText(), userName.trim(),
                    bccTxt.getText(), ccTxt.getText(), accountBox.getSelectedItem().toString().trim(), messageTxt.getText().trim(),
                    password.trim(), subjectTxt.getText());

            String result = sendEmail.send();
            //pm.dispose();
            JOptionPane.showMessageDialog(null, result);
        }
    }

    private class ProgressMonitor extends JDialog {

        public ProgressMonitor() {
            this.setLayout(new BorderLayout());
            JLabel text = new JLabel("Sending..Please wait...");
            this.add(text, "Center");
            this.pack();
            this.validate();
            this.setLocationRelativeTo(null);
        }
    }
}

まず、これは電子メール プログラムです。ここでは、JDialog が呼び出されると、100% 空白のウィンドウとして開きます。JLabel を追加しましたが、表示時に表示されません。とにかく、電子メールの送信には時間がかかります。電子メールの送信後、JDialog で JLabel を確認できます。問題を 1 つの文にまとめると、電子メールが送信される前に JDialog を呼び出していますが、電子メールが送信された後は空白で表示され、コンテンツはそこにあります。どうしてこれなの?助けてください!

4

2 に答える 2

3

あなたのコードはSSCCEではありません

1.1。SendEmailForm();

  • 削除するthis.validate();

  • this.setVisible(true);最後のコード行として移動

  • this.pack();前に移動this.setVisible(true);

  • this.setLocationRelativeTo(null);前に移動this.setVisible(true);

2. public ProgressMonitor() {coud be

コード

    private class ProgressMonitor extends JDialog {

        public ProgressMonitor() {
            setLayout(new BorderLayout());
            JLabel text = new JLabel("Sending..Please wait...");
            add(text, "Center");
            pack();
            setLocationRelativeTo(null);
            SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                    setVisible(true);
                }
            });
        }
    }

3.残りはあなたの質問から明確ではありません

  • 表示されているコンテナにJComponents追加された場合、最後のコード行(re)validate()repaint()

  • JDialog次のアクションで再利用しHIDE_on_CLOSE、デフォルトのクローズ操作として設定しますJDialog

  • 拡張しないでくださいJDialog。このcontianerをローカル変数として作成してください。そうすれば(my)JDialog.setVisible(true、次のアクション(ラップされたinvokeLater())でのみ)を呼び出すことができます。

于 2012-09-28T15:43:25.533 に答える
0

多数のコンポーネントを作成JFrameしましたが、アプリケーションの に追加していません。を使用してGrigBagLayoutいるため、各コンポーネントに制約を設定する必要があります。たとえば、次のようになります。

subject = new JLabel("Subject: ");
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1.0;
gbl.setConstraints(subject, gbc);
add(subject);

また、最初にレイアウトと制約をインスタンス化することを忘れないでください:

private GridBagLayout gbl = new GridBagLayout();
private GridBagConstraints gbc = new GridBagConstraints();
于 2012-09-28T15:50:38.450 に答える