在Netbeans中,我创建了一个GUI项目,该项目使用框架前端,我可以添加组件并双击以编辑其事件。我指的是有“源”、“设计”和“历史”选项卡的窗口。
以下是组件和关系:
1-打开文件选择器的按钮。
2-显示文件选择器结果的文本区域。如果用户选择一个文件,它将在文本区域显示文件名;否则它会写“被用户取消”。
3-同时,如果用户选择了一个文件,我想打开一个“please wait”(请等待)对话框,切换SwingWorker(SwingWorker)并在后台进行一些工作。
问题是,当用户选择文件时,我没有看到请等待对话框!!Netbean生成的完整代码可在pastebin获得。部分代码显示在这里:
private void OpenSongFileActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
JFileChooser fileChooser = new JFileChooser();
fileChooser.setAcceptAllFileFilterUsed(false);
FileNameExtensionFilter filter = new FileNameExtensionFilter("MP3 files", "mp3");
fileChooser.addChoosableFileFilter(filter);
fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
int result = fileChooser.showOpenDialog(this);
if (result != JFileChooser.APPROVE_OPTION) {
//ReadInfo.setText("No song has been selected");
System.out.println("OpenSongFile canceled by user");
return;
}
final JDialog loading = new JDialog(this);
JPanel p1 = new JPanel(new BorderLayout());
p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
loading.setUndecorated(true);
loading.getContentPane().add(p1);
loading.pack();
loading.setLocationRelativeTo(this);
loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
loading.setModal(true);
SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws InterruptedException {
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++)
;
return "hello";
}
@Override
protected void done() {
loading.dispose();
}
};
worker.execute();
loading.setVisible(true);
try {
worker.get();
} catch (Exception e1) {
e1.printStackTrace();
}
File selectedFile = fileChooser.getSelectedFile();
ReadInfo.setText("Selected file: " + selectedFile.getAbsolutePath());
}
P. S:我使用了这里解释的SwingWorker代码。
工人。get()将一直阻止,直到SwingWorker返回,这意味着您正在阻止EDT,阻止显示对话框。
相反,使用SwingWorker
的Property tyChangeListener
支持和监控START
和DONE
事件
SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws InterruptedException {
Thread.sleep(5000);
return "hello";
}
@Override
protected void done() {
loading.dispose();
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println(evt.getPropertyName());
Object value = evt.getNewValue();
if (value instanceof SwingWorker.StateValue) {
SwingWorker.StateValue state = (SwingWorker.StateValue) value;
switch (state) {
case DONE: {
try {
String result = worker.get();
JOptionPane.showMessageDialog(null, result);
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
break;
}
}
}
});
worker.execute();
loading.setVisible(true);
另一个问题是,您的循环可能运行得太快,以至于窗口在屏幕上显示之前就关闭了。
例如,我只是使用了线程。sleep暂停doInBackground方法5秒钟。。。
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
public class Memory extends JFrame {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
makeItSo();
}
});
}
public static void makeItSo() {
final JDialog loading = new JDialog();
JPanel p1 = new JPanel(new BorderLayout());
p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
loading.setUndecorated(true);
loading.getContentPane().add(p1);
loading.pack();
loading.setLocationRelativeTo(null);
loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
loading.setModal(true);
SwingWorker<String, Void> worker = new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws InterruptedException {
Thread.sleep(5000);
return "hello";
}
@Override
protected void done() {
loading.dispose();
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println(evt.getPropertyName());
Object value = evt.getNewValue();
if (value instanceof SwingWorker.StateValue) {
SwingWorker.StateValue state = (SwingWorker.StateValue) value;
switch (state) {
case DONE: {
try {
String result = worker.get();
JOptionPane.showMessageDialog(null, result);
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
break;
}
}
}
});
worker.execute();
loading.setVisible(true);
}
}
我正在尝试弹出一个自定义对话框,当我点击一个按钮,但它不会弹出在所有。我的应用程序基本上是一个日历,我将使用sqlite在日历中添加/保留约会和其他内容,使用对话框,这是指定约会细节的地方。 我为此使用的代码如下: 我做错了什么?
在我的应用程序中,当我试图显示自定义的框时,它在android手机中运行良好。现在,当我在android选项卡上安装应用程序时,一切都很好,只有自定义框有问题。不显示。所以我想,我应该检查正常对话框,它工作正常。下面是普通对话框和警报对话框的代码。
我正在尝试利用今天刚刚发布的Google的评论API(Play Core库1.8.0)。请参阅 https://developer.android.com/guide/playcore/in-app-review。我目前正在使用以下代码使用它: 我已经使用Google Play开发者控制台中的内部测试轨道进行了测试,但不幸的是,我的测试帐户上没有收到评论对话框。我做错了什么?
测试电话上的应用程序设置中接受存储的所有权限。App已经被清除了两次数据,以及卸载和重新安装。 最初在此称为: 当然这里需要权限。请注意“permissions!=1”vs“permissions!=PackageManager.Permission_Granted”,否则将不会运行到RequestPermissions中: 权限变量如下:
嗨,我是primefaces的新手,我对数据表中显示的值有一些问题。我从sql数据库加载数据,并在dataTable中显示这些数据。有一个柱子叫做“评论”,里面有一个按钮。如果你点击这个按钮,就会打开一个对话框。在这个对话框框架内,也应该有一些与我在dataTable中显示的相同的值,但它不起作用。我无法显示该对话框框中的值。我在谷歌上搜索了很多次,也尝试了很多次,但都无济于事。下面是xhtml:
以下是我的AlertDialog无响应状态的屏幕截图: 在背景中,绿色瓷砖、黑色和白色目标中的红色球,所有三个位图都在一个渲染线程上连续渲染,该线程锁定/解锁手机上的背景画布。当我按下OK按钮时,无论我在EditText中输入了什么文本,都会执行此无响应操作。 这是代码: 游戏活动班: 由于未知原因,只有在AlertDialog之前存在准备好的活套时,AlertDialog才会执行。调用show(