簡體   English   中英

JFrame 不顯示內容

[英]JFrame doesn't show content

我正在嘗試構建一個簡單的 Swing 應用程序,用於在 GUI 中插入文件路徑。 (我知道有 JOptionPane 可以解決這個問題,但我想在用戶鍵入時檢查插入的路徑是否存在。)
我構建了一個 JFrame 並添加了一個 JTextField 和一個 JButton。 它只是另一個程序的一部分,因此它應該在主程序處於活動狀態時暫停。
現在,當我啟動程序時,JFrame 本身會正常構建。 但它不加載內容,它不可關閉,當我嘗試調整 window 的大小時,整個程序掛起,我必須從 IDE 強行停止它。

該程序不會拋出任何異常。 我嘗試插入一些日志來測試程序是否在任何時候掛起,我什至查看了組件的getSize() ,但一切都應該是 - 除了 JFrame 的內容在屏幕。 最奇怪的是,我還有另一種基本相同的方法,只是使用了其他組件——而且效果很好。
我已經搜索過類似的問題,但沒有成功。 有誰知道我做錯了什么?

這是我的代碼:

import java.awt.BorderLayout;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test {
    
    public static String showFileDirInputDialog(String title, String dir) {
        boolean ready = false;
        String newFile = "";
        
        Thread windowThread = new Thread(() -> {
            JFrame frame = new JFrame(title);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(600, 150);
            
            JTextField txt = new JTextField(dir);
            frame.getContentPane().add(txt, BorderLayout.CENTER);
            txt.addInputMethodListener(...); // check inserted path while typing
            
            JButton ok = new Button("OK");
            frame.getContentPane().add(ok, BorderLayout.CENTER);
            ok.addActionListener((e) -> {
                newFile = txt.getText();
                frame.dispose();
                ready = true;
            });
            
            frame.setVisible(true);
        }, "window thread");
        windowThread.start();
        
        while(!ready) {
            System.out.print(""); // do nothing while the window is active
        }
        windowThread.interrupt();
        return newFile;
    }
}

好的,感謝@camickr,我找到了SwingWorker的解決方案:

package test;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingWorker;

public class Test {
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(150, 70);
        
        JButton btn = new JButton("Start");
        btn.addActionListener((e) -> {
            SwingWorker<String, Void> worker = new SwingWorker<>() {
                @Override
                protected String doInBackground() throws Exception {
                    return showFileInput("Insert file path");
                }
                
                @Override
                protected void done() {
                    try {
                        System.out.println(get());
                    }
                    catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                    finally {
                        System.exit(0);
                    }
                }
            };
            worker.execute();
        });
        frame.getContentPane().add(btn);
        
        frame.setVisible(true);
    }
    
    static String newPath = "";
    static boolean ready = false;
    
    static String showFileInput(String title) {
        Thread windowThread = new Thread(() -> {
            JFrame frame = new JFrame(title);
            frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            frame.setSize(500, 70);
            
            JTextField txt = new JTextField("");
            frame.getContentPane().add(txt, BorderLayout.CENTER);
            
            JButton okButton = new JButton("OK");
            okButton.addActionListener((e) -> {
                newPath = txt.getText();
                frame.dispose();
                ready = true;
            });
            frame.getContentPane().add(okButton, BorderLayout.EAST);
            
            Timer checkInputTimer = new Timer("check input thread");
            checkInputTimer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    File f = new File(txt.getText());
                    okButton.setEnabled(f.exists());
                }
            }, 0, 300);
            
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    newPath = txt.getText();
                    frame.dispose();
                    ready = true;
                }
            });
            frame.setVisible(true);
        }, "window thread");
        windowThread.start();
        
        while(!ready) {
            System.out.print("");
        }
        windowThread.interrupt();
        return newPath;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM