3

の拡張機能を作成しましたJDialog

public class ImageDialog extends JDialog implements ActionListener {
    private JTextField textField;

    public ImageDialog(JFrame parent, String title, 
                        String message, BufferedImage bufferedImage) {
        super(parent, title, true);
        if (parent != null) {
            Dimension parentSize = parent.getSize();
            Point p = parent.getLocation();
            setLocation(p.x + parentSize.width / 4, p.y + parentSize.height / 4);
        }

        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setModal(true);

        JPanel frame = new JPanel();
        frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));

        frame.add(new JLabel(message), BorderLayout.PAGE_START);

        JLabel lblimage = new JLabel(new ImageIcon(bufferedImage));
        frame.add(lblimage, BorderLayout.CENTER);

        textField = new JTextField(1);

        frame.add(textField, BorderLayout.PAGE_END);

        getContentPane().add(frame);

        JPanel buttonPane = new JPanel();
        JButton button = new JButton("OK");
        buttonPane.add(button);
        button.addActionListener(this);
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public String getTextField() {
        return textField.getText();
    }

    public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
    }
}

それはうまく機能し、使用された後にjvmが閉じないことを除いて、本来の機能を果たします。次のように使用します。

ImageDialog dlg = new ImageDialog(new JFrame(), "Important question", "How many fluffy bunnies do you see?", img);
System.out.println(dlg.getTextField());
dlg.dispose();

しかし、プログラムが完了すると、JVM はそこでハングアップします。これを修正する方法はありますか?

4

3 に答える 3

3

DISPOSE_ON_CLOSEダイアログとフレームを使用するこの SSCCE では問題なく動作するようです。

注: Java 仮想マシン (VM) 内の最後の表示可能なウィンドウが破棄されると、VM が終了する場合があります。

そのメモは、アプリの場合に重要です。はDISPOSE_ON_CLOSE一貫して使用され、VM は終了に失敗します。これは、デーモン以外のスレッドが実行されていることを示しています (amok?)。そのスレッドのソースを見つけて、適切な措置を講じて正常に終了することをお勧めします。

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

public class ImageDialog extends JDialog implements ActionListener {
    private JTextField textField;

    public static void main(String[] args) {
        JFrame f = new JFrame("Image Dialog Test");
        BufferedImage bi = new BufferedImage(128,50,BufferedImage.TYPE_INT_RGB);
        f.setLocationByPlatform(true);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.setSize(400,100);
        f.setVisible(true);
        new ImageDialog(f, "Hi!", "Hello World", bi);
    }

    public ImageDialog(JFrame parent, String title, 
                        String message, BufferedImage bufferedImage) {
        super(parent, title, true);
        if (parent != null) {
            Dimension parentSize = parent.getSize();
            Point p = parent.getLocation();
            setLocation(p.x + parentSize.width / 4, p.y + parentSize.height / 4);
        }

        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setModal(true);

        JPanel frame = new JPanel();
        frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));

        frame.add(new JLabel(message), BorderLayout.PAGE_START);

        JLabel lblimage = new JLabel(new ImageIcon(bufferedImage));
        frame.add(lblimage, BorderLayout.CENTER);

        textField = new JTextField(1);

        frame.add(textField, BorderLayout.PAGE_END);

        getContentPane().add(frame);

        JPanel buttonPane = new JPanel();
        JButton button = new JButton("OK");
        buttonPane.add(button);
        button.addActionListener(this);
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public String getTextField() {
        return textField.getText();
    }

    public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
    }
}
于 2013-07-05T19:54:41.803 に答える