[英]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.