1

今のところ、この問題の原因がわかりません。

シリアル化されたハッシュ マップ オブジェクト (単語と意味のペアが格納されている) を読み込み、ユーザーが入力した単語の意味を表示する、小さな (ばかげているかもしれない!) 辞書プログラムを作成しました。

最初はオブジェクトを完全にロードしてからGUIを表示するようにしましたが、オブジェクトをロードするのに3秒かかったので、GUIを表示してユーザーに単語を入力させ、その間にオブジェクトを別々にロードする方が良いと思いましたユーザーが単語をより速く入力した場合 (つまり、オブジェクトが読み込まれる前)、「読み込み中..」というダイアログが表示され、オブジェクトが読み込まれるとダイアログが閉じ、ユーザーに意味が表示されます。

問題は、ダイアログ ボックスのみが表示され、「読み込み中...」というメッセージが表示されないことです。

コードは次のとおりです。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.io.*;

class Dict implements Runnable {

    HashMap hm = null;
    JTextField ji;
    JTextArea jo;
    JFrame jfobj;

    public void run() {
        try {
            FileInputStream fis = new FileInputStream("serialhm");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Thread.currentThread().sleep(3000);// on an average it takes 3 secs to read the object, i made it sleep because the serialhm file i provided has only one word - "break"
            hm = (HashMap) ois.readObject();
            ois.close();
        } catch (Exception e) {

            System.exit(0);
        }
    }

    public void print_meaning() {
        final JDialog dial = new JDialog();
        dial.setEnabled(true);
        dial.setModal(false);
        dial.setSize(200, 200);
        dial.setLocationRelativeTo(null);
        dial.getContentPane().add(new JLabel("loading......please wait"));
        dial.pack();
        if (hm == null) {

            dial.setVisible(true);//is not showing the message,only the dialog box is shown
            while (true) {
                if (hm != null) {
                    dial.setVisible(false);
                    dial.dispose();
                    break;
                }
            }
        }

        String word = ji.getText();
        String meaning = "";
        ArrayList al1 = (ArrayList) hm.get(word);
        if (al1 == null) {
            JOptionPane.showMessageDialog(jfobj, "word unavailable");
            ji.setText("");
            jo.setText("");

        } else {
            for (int i = 0; i < al1.size(); i++) {
                meaning = meaning + "\n" + (String) al1.get(i);
            }

            jo.setText(meaning + "\n");
            ji.selectAll();
        }

    }

    public void gui() {
        jfobj = new JFrame();
        Font font1 = new Font(Font.SERIF, Font.PLAIN, 17);

        jo = new JTextArea(15, 30);
        jo.setEditable(false);
        jo.setFont(font1);
        jo.setLineWrap(true);
        jo.setWrapStyleWord(true);

        JScrollPane scrollPane = new JScrollPane(jo, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        ji = new JTextField(30);
        ji.setFont(font1);


        GridBagLayout gridBag = new GridBagLayout();
        Container contentPane = jfobj.getContentPane();
        contentPane.setLayout(gridBag);

        GridBagConstraints gridCons1 = new GridBagConstraints();
        gridCons1.gridwidth = GridBagConstraints.REMAINDER;
        gridCons1.fill = GridBagConstraints.HORIZONTAL;
        contentPane.add(ji, gridCons1);

        GridBagConstraints gridCons2 = new GridBagConstraints();
        gridCons2.weightx = 1.0;
        gridCons2.weighty = 1.0;
        contentPane.add(scrollPane, gridCons2);

        ji.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                print_meaning();
            }
        });
        jfobj.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        jfobj.pack();
        jfobj.setVisible(true);
    }

    public static void main(String[] args) throws Exception {

        Dict dobj = new Dict();
        Thread t = new Thread(dobj);
        t.start();
        dobj.gui();

    }
}

シリアル化されたハッシュマップ オブジェクトを持つファイル ('serialhm') は次のとおりです: http://www.mediafire.com/?rc5nda0qs8891xv

簡単にするために、それは単一の単語のハッシュマップのみであり、この辞書の唯一の単語は「break」です

また、私の拙いデザインをご容赦ください。ありがとうございます。

ハッシュマップ オブジェクトの完全なシリアル化ファイルが必要な場合は、私もアップロードします。203000 ワードあります。

4

1 に答える 1

0

わかりました、while(true)ブロックを新しいスレッドに移動し、マイナーな変更を加えました。

于 2012-05-30T14:14:51.540 に答える