当前位置: 首页 > 知识库问答 >
问题:

将JOptionPane链接到JFileChooser中

齐阳
2023-03-14

我正在尝试使用Swing发出文件传输通知。这个想法是,当我的应用程序通过网络提供文件时,用户会收到一个JOptionPane,询问他或她是否想接受所述文件报价,如果他们的答案是是,我想打开一个JFileChooser,以便他们可以浏览到他们想要保存文件的位置。

我遇到的问题是两者单独工作都很好,但是当我设置它们以便JOptionPane打开JFileChooser我的应用程序死锁时。

有人知道这里出了什么问题吗?我尝试了调试,但没有发现任何奇怪的行为来表明它为什么会死锁。

编辑:下面的示例代码似乎运行良好,让我相信问题可能出在另一个线程中。更多详细信息:

我使用应用程序线程、应用程序层线程和“主”线程,主线程根据我定义的字符串生成一个字节数组,然后它通过我的应用程序层将生成的字节数组发送到我的应用程序中。

应用程序层是可观察的,应用程序是其观察者。

当ApplicationLayer接收到所述字节数组时,它将其解析回字符串,并通知其观察者它已经这样做了。

然后,应用程序将收到通知。在我的示例中,应用程序注意到字符串是一个文件提供,并相应地调用“saveFile”方法,如下面的代码所示。

代码:

  package application;

    public class GUI extends JFrame implements ActionListener, ItemListener, Observer {

private JPanel cp = new JPanel();
private JPanel ulp = new JPanel();
private JTextField  myMessage;
private JTextArea   taMessages;
    // Menu Bar Elements
JMenuBar menuBar;
JMenu menu, submenu;

public GUI(){
    super();    
    this.setLayout(new BorderLayout());

    setPreferredSize(new Dimension(800, 600));
    setMinimumSize(new Dimension(800, 600));

    buildBarMenu();
    buildChatMenu();

    addWindowListener(new WindowAdapter() {
        public void windowClosing(final WindowEvent e) {
            e.getWindow().dispose();
        }
        public void windowClosed(final WindowEvent e) {
            System.exit(0);
        }
    }
            );

    pack();
    validate();
    setVisible(true);

}

    public static void main(final String[] args) {
    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (Exception e) {
        // If Nimbus is not available, fall back to cross-platform
        try {
                     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } catch (Exception ex) {

        }
    }
    new GUI();
    }
    private void buildBarMenu(){
    // Create the menu bar
    JMenuBar menuBar = new JMenuBar();

    // Create a menu
    JMenu menu = new JMenu("File");

    menu.setHorizontalTextPosition(SwingConstants.CENTER);
    menu.setVerticalTextPosition(SwingConstants.BOTTOM);

    menuBar.add(menu);

    // SendFile Item
    JMenuItem sendFileItem = new JMenuItem("Send File");
    sendFileItem.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            saveFile(); // Put whatever here
        }
    });
    // Exit item
    JMenuItem exitItem = new JMenuItem("Exit");
    exitItem.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {

            System.exit(0);
        }
    });
    menu.add(sendFileItem);
    menu.add(exitItem);

    this.setJMenuBar(menuBar);
    }

private void buildChatMenu() {

    this.add(cp, BorderLayout.CENTER);
    this.add(ulp, BorderLayout.EAST);

}

/**
 * Method to be called for saving files when a file transfer
 * request is received
 * @return the path to save the file to
 */
public String saveFile(){

    int choice = JOptionPane.showConfirmDialog(GUI.this, "You are being offered a file, accept?", "File Offer",
            JOptionPane.YES_NO_OPTION);

    if (choice == JOptionPane.YES_OPTION){
        System.out.println("yes");
        JFileChooser c = new JFileChooser();

        int rVal = c.showOpenDialog(GUI.this);
        if (rVal == JFileChooser.APPROVE_OPTION) {

        }
        if (rVal == JFileChooser.CANCEL_OPTION) {

        }

    }else{
        System.out.println("no");
    }
    return null;

}

public void save2(){
    JFileChooser c = new JFileChooser();


    int rVal = c.showOpenDialog(GUI.this);
    if (rVal == JFileChooser.APPROVE_OPTION) {
        System.exit(0);

    }
    if (rVal == JFileChooser.CANCEL_OPTION) {
        System.exit(0);

    }
}


@Override
public void itemStateChanged(ItemEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub

}

    @Override
public void update(Observable o, Object arg) {


    if(arg instanceof ChatMessage){
        cp.addMessage(((ChatMessage) arg).getNickname(), ((ChatMessage) arg).getMessage());
    }
    else if(arg instanceof FileOfferMessage){

        cp.addMessage("FILE OFFER", ((FileOfferMessage) arg).getFileName() + " | File Size: " + ((FileOfferMessage) arg).getFileSize() + " bytes");
        saveFile();
    }


}


   }

共有1个答案

东郭源
2023-03-14

任何使用Swing组件的代码都必须在EventDispatchThread中运行。您的main()方法应该调用invokeLater,并在传递的可运行的执行GUI操作(包括外观部分)。

P、 这是在关闭窗口时退出应用程序的首选方式。

 类似资料:
  • 问题内容: 我正在使用JOptionPane来显示一些产品信息,并且需要向网页添加一些链接。 我发现您可以使用包含html的JLabel,因此我提供了一个链接。该链接在对话框中显示为蓝色并带有下划线,但是不可单击。 例如,这也应该起作用: 如何在JOptionPane中获得可点击的链接? 谢谢,保罗。 编辑 -例如解决方案 问题答案: 您可以将任何组件添加到JOptionPane。 因此,添加一个

  • 问题内容: 我在main.storyboard上创建了一个UI元素,需要隐藏该元素,直到游戏结束,并且一旦玩家点击屏幕将其关闭即可。Main.storyboard链接到GameViewController,因此我所有的IBOutlet和IBActions都在其中,而我所有的游戏代码都在GameScene中。我如何将视图控制器链接到场景,以便弹出图像和按钮仅在游戏结束时出现。非常感谢您的帮助,我已经

  • 我试图在我的< code>Browser类(在eclipse中创建)中实现一个历史按钮,并且我希望按钮中的链接是可点击的。下面是当用户按下按钮< code>History时启动的代码: 在上面的代码中,是一个包含以前访问过的所有网页的列表。 我尝试过使用这里介绍的方法:JOptionPane中的可点击链接,我让它工作了。问题是,此解决方案仅允许我预定义URL:s,但我希望显示我的列表,并且其中的U

  • 问题内容: 我在运行64位Ubuntu 12.04的桌面上下载并构建了gcc 4.8.1。我像文档建议一样使用命令从源代码中构建它 它似乎通过了所有测试,我将所有内容都安装到了带有后缀-4.8的主目录中,以区别于版本4.6.3的系统gcc。 不幸的是,当我使用g -4.8编译c 程序时,它链接到系统libc和libstdc ,而不是从gcc-4.8.1编译的较新的程序。我下载并构建了gcc 4.8

  • 问题内容: 我已经从源代码构建了OpenSSL(一个有意的旧版本;使用来构建),并且更愿意使用我所构建的内容,而不用链接到我的程序。 失败的命令是: 并且我收到一系列类似于以下的错误: 这使我认为我的OpenSSL有点时髦。如果我从命令中省略,则错误变为无法执行以下操作: 我是否编译不正确的OpenSSL?还是我应该如何最好地解决这个问题? 问题答案: 愚蠢的“ Linux-isms”再次罢工!很

  • 一些背景,我正在开发Java游戏,我正在使用Netbeans来构建它,我目前有2个java文件 App.java 董事会.java 现在我可以创建和显示一个简单的棋盘与所有的棋子在正确的位置我的问题是分配任何鼠标事件到这些棋子 目前,我使用textpad编写测试代码,并且没有图像的文件夹链接,并且已经能够让鼠标事件在那里工作,因此我知道事件的代码没有问题。 但是现在我正在Netbean中编写程序清