java - JDialog 获取输入,而不是获取错误

标签 java swing file jdialog

我编写了一个扩展JDialog的类,当我按保存时显示(保存是一个JMenuItem对象)。但是,当我按下“保存”时,我收到一个对话框,其中显示文件名为空,并且我没有机会输入任何内容。

我在这里做错了什么?任何帮助将不胜感激。

谢谢。

这是我的 JDialog 扩展类的代码:

package ui;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class SaveImageView extends JDialog {
    private final JPanel contentPanel = new JPanel ();
    private JTextField txtFilename;

    public int type; // 0 -> png, 1 -> jpg, 2 -> gif
    public String filename;

    public SaveImageView () {
        setTitle("Save Image");
        setBounds(100, 100, 450, 230);
        getContentPane().setLayout(null);
        contentPanel.setBounds(0, 0, 434, 229);
        contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
        getContentPane().add(contentPanel);
        contentPanel.setLayout(null);

        {
            JLabel lblFilename = new JLabel("Filename: ");
            lblFilename.setBounds(10, 95, 58, 20);
            contentPanel.add(lblFilename);
        }

        {
            txtFilename = new JTextField();
            txtFilename.setBounds(78, 95, 123, 20);
            contentPanel.add(txtFilename);
            txtFilename.setColumns(10);
        }

        {
            JRadioButton rdbtnGif = new JRadioButton("GIF");
            rdbtnGif.setBounds(123, 11, 43, 23);
            contentPanel.add(rdbtnGif);
            rdbtnGif.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    type = 2;
                }
            });
        }

        {
            JRadioButton rdbtnJpg = new JRadioButton("JPG");
            rdbtnJpg.setBounds(123, 37, 43, 23);
            contentPanel.add(rdbtnJpg);
            rdbtnJpg.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    type = 1;
                }
            });
        }

        {
            JRadioButton rdbtnPng = new JRadioButton("PNG");
            rdbtnPng.setBounds(123, 63, 45, 23);
            contentPanel.add(rdbtnPng);
            rdbtnPng.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    type = 0;
                }
            });
        }

        JLabel lblImageTypeTo = new JLabel("Image type to save: ");
        lblImageTypeTo.setBounds(10, 11, 144, 23);
        contentPanel.add(lblImageTypeTo);

        JLabel lblNote = new JLabel("NOTE: Images will be saved in \"output\" folder.");
        lblNote.setBounds(10, 132, 273, 22);
        contentPanel.add(lblNote);

        {
            JPanel buttonPane = new JPanel();
            buttonPane.setBounds(0, 160, 434, 33);
            contentPanel.add(buttonPane);
            buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));

            {
                JButton okButton = new JButton("OK");
                okButton.setActionCommand("OK");
                buttonPane.add(okButton);
                getRootPane().setDefaultButton(okButton);
                okButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        filename = txtFilename.getText();
                    }
                });
            }

            {
                JButton cancelButton = new JButton("Cancel");
                cancelButton.setActionCommand("Cancel");
                buttonPane.add(cancelButton);
            }
        }
    }
}

这是在我的主 GUI 类中,这是我将 ActionListener 添加到项目时的情况:

//////////////////////////////////////////////////////////
//                  Save - Menu Item                    //
//////////////////////////////////////////////////////////
JMenuItem saveItem = new JMenuItem("Save");
saveItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        SaveImageView siv = new SaveImageView();
        siv.setVisible(true);
        String typeStr = (siv.type == 0) ? "png" : ((siv.type == 1) ? "jpg" : "gif");
        try {
            ImageIO.write(img, typeStr, new File("output/" + siv.filename + "." + typeStr));
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
});
menu.add(saveItem);

这是我收到的错误:

java.io.FileNotFoundException: output\null.png (The system cannot find the path specified)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(Unknown Source)
    at javax.imageio.stream.FileImageOutputStream.<init>(Unknown Source)
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(Unknown Source)
    at javax.imageio.ImageIO.createImageOutputStream(Unknown Source)
    at javax.imageio.ImageIO.write(Unknown Source)
    at ui.PPMViewer$1.actionPerformed(PPMViewer.java:40)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.imageio.ImageIO.write(Unknown Source)
    at ui.PPMViewer$1.actionPerformed(PPMViewer.java:40)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$400(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.awt.EventQueue$2.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

看起来像代码:filename = txtFilename.getText();永远不会被调用,因为您在保存之前没有单击“确定”按钮。

这是因为你的主 GUI 类在打开 JDialog 后不会暂停,而是继续运行。

停止此行为的一种方法是将窗口模式设置为 true ,或者,如果您想避免魔法值,Dialog.ModalityType.DEFAULT_MODAL .

因此在构造函数中添加行 setModal(true) .

<小时/>

按下“确定”和“取消”按钮后,您将需要退出 JDialog 。 您可以通过添加以下行来完成此操作:

dispose();

到您的 ActionListener 代码。

关于java - JDialog 获取输入,而不是获取错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252472/

相关文章:

c - 为什么这不写(接收)正确的字节数?

python - 对列多个文件 Pandas 的操作

shell - 波浪号 (~/) 无法处理 Shell 脚本中的 if then 语句

java - 错误请求 - 来自 Android 模拟器的 SOAP WCF Web 服务的主机名异常无效

java - 如何使用JPanel和Jframe在相对(X,Y)上进行鼠标事件

java - 如何使用swing永久存储最近的项目

java - SwingWorker 在(不成功的)JLabel 图标更新时锁定 GUI

java - 对于同一个 REST 方法,我们可以有多个 @Path 注释吗

java - Vaadin:一个合适的设计模式

用于在 aws tomcat elastic beanstalk 上托管的 java 对象序列化