- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建我的第一个 gui,到目前为止一切正常,除了 JDialog
的故障。 .它在第一次使用时相应地接受名称和进程列表。但是当我把它拉回来输入新的输入时,它仍然没有响应。我认为这不是线程问题,因为我已经使用多个 System.out.println ( SwingUtilities.isEventDispatchThread() );
测试了代码整个源代码中的语句。这是可能导致问题的部分代码。
package testme;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Test {
JDialog dialog;
JButton horseList, ok, clear;
JPanel jpDialog = new JPanel();
JPanel buttonPanel = new JPanel();
GridBagLayout gbLayout = new GridBagLayout();
BorderLayout borderLayout = new BorderLayout();
GridBagConstraints gbc = new GridBagConstraints();
int fnh = 8;
JTextField[] jtxt = new JTextField[fnh];
int[] hNum = new int[fnh];
int[] hVal = new int[fnh];
String[] hNam = new String[fnh];
JFrame jfr = new JFrame();
public Test() {
jfr.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
jfr.setTitle("My Alladin Lamp");
jfr.setSize( 200, 80 );
jfr.setVisible( true );
jfr.setLayout( borderLayout );
horseList = new JButton( "Enter Horse Names" );
jfr.add( horseList, BorderLayout.CENTER );
horseList.addActionListener( new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
dialog = new JDialog( jfr, "Enter Horse Names", true );
dialog.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
dialog.setSize( 260, 400 );
jpDialog.setLayout( gbLayout );
JLabel label;
String str;
for( int i = 0; i < fnh; i++ )
{
gbc.gridx = 0;
gbc.gridy = i;
str = new Integer( i+1 ) + ".";
label = new JLabel( str );
jpDialog.add( label, gbc );
gbc.gridx = 1;
gbc.gridy = i;
gbc.ipady = 4;
gbc.insets = new Insets(4,0,0,0);
jtxt[i] = new JTextField(15);
jpDialog.add( jtxt[i], gbc );
}
buttonPanel = new JPanel();
ok = new JButton( "OK" );
ok.addActionListener( new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
for( int i = 0; i < fnh; i++ ) {
hNam[i] = jtxt[i].getText();
}
dialog.dispose();
}
});
buttonPanel.add( ok );
clear = new JButton ( "CLEAR" );
clear.addActionListener( new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
for( int i = 0; i < fnh; i++ )
if ( !"".equals( jtxt[i].getText() ) )
jtxt[i].setText( "" );
}
});
buttonPanel.add( clear );
JScrollPane jscr = new JScrollPane( jpDialog );
dialog.add( jscr, BorderLayout.CENTER );
dialog.add( buttonPanel, BorderLayout.SOUTH );
dialog.setVisible( true );
}
});
}
// -------------------------------------------------------------------------
public static void main( String args[] ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run()
{
Test test = new Test();
}
});
}
}
最佳答案
当dispose
被调用,对话框的资源被释放。您必须完全从头开始分配一个新的,或者 - 更好的是 - 调用 setVisible(false)
关闭对话框,然后 setVisible(true)
当你再次需要它时。
第二种方法更好,因为复杂的对话可能需要相当长的时间来构建。立即弹出对话框对用户来说是一种更好的体验。由于这个原因,我的应用程序在应用程序启动期间构建了复杂的对话框 - 在任何用户界面可见之前,而启动画面仍在显示。
您可以覆盖 setVisible
以确保对话框在每次显示时都重新初始化。
如果您仍想在每次需要对话框时从头开始构建,然后 dispose
当用户进行选择时,最好的方法是子类 JDialog
.您的代码失败,因为它在封闭类中分配对话框的某些部分(例如布局),然后假设这些部分在 dispose()
之后仍然存在叫做。这是个大问题。如果你继承 JDialog
,你几乎不可能犯这样的错误。对话框的各个部分都将在构造函数中分配并在子类本身中引用。对话后是displosed
, 不能存在对其字段/成员的引用。
好的,我将展示一个处理几种常见情况的示例:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame {
// The dialog we'll create and use repeatedly.
TestDialog testDialog;
// Some words to fill a list.
String [] words = ("Four score and seven years ago our fathers brought "
+ "forth on this continent a new nation conceived in liberty and "
+ "dedicated to the proposition that all men are created equal")
.split("\\s+");
// Start index of words to load next time dialog is shown.
int wordIndex = 0;
// A place we'll show what was done by the dialog.
JLabel msg;
public Test() {
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add the "show dialog" button.
JButton showDialog = new JButton("Press to show the dialog");
add(showDialog, BorderLayout.NORTH);
// Add the "dialog result" label.
msg = new JLabel(" Dialog Result: --");
add(msg, BorderLayout.CENTER);
showDialog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Create the dialog lazily.
if (testDialog == null) {
testDialog = new TestDialog(Test.this);
}
// Load fresh data in the dialog prior to showing it.
// Here it's just an array of words into the dialog.
String [] newWords = new String[5];
for (int i = 0; i < newWords.length; i++) {
newWords[i] = words[wordIndex];
wordIndex = (wordIndex + 1) % words.length;
}
testDialog.initialize(newWords);
// Show the dialog and block until user dismisses it.
testDialog.setVisible(true);
// Handle the result. Here we just post a message.
if (testDialog.getOkClicked()) {
msg.setText("Ok, we have: " + testDialog.getSelectedString());
}
else {
msg.setText("Cancelled!");
}
}
});
}
public static void main(String[] args) {
// Don't forget Swing code must run in the UI thread, so
// must invoke setVisible rather than just calling it.
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test().setVisible(true);
}
});
}
}
// A test dialog with some common UI idioms. Subclass JDialog so
// that all dialog data is encapsulated. Nice and clean.
class TestDialog extends JDialog {
// A list of words that can be double-clicked to return a result.
private final JList<String> list;
// A design pattern that works well for all modal dialogs:
// Boolean flag that's True if OK was clicked, list double-clicked, etc.
// False if the dialog was cancelled or closed with no action.
boolean okClicked;
public TestDialog(JFrame owner) {
super(owner, true); // true => modal!
JPanel content = new JPanel(new GridBagLayout());
// Initialize all dialog components and set listeners.
// Hierarchy listener is a way to detect actual visibility changes.
addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
// Reset the ok clicked flag every time we become visible.
// We could also do this by overriding setVisible, but this is cleaner.
// Can also do other state settings like clearing selections.
if (isVisible()) {
okClicked = false;
list.clearSelection();
}
}
});
// Set up child components.
// The usual Java layout fiddling. Nothing special here.
// Add the list first at position (0,0) spanning 2 columns.
GridBagConstraints constraint = new GridBagConstraints();
constraint.fill = GridBagConstraints.HORIZONTAL;
constraint.gridwidth = 2;
list = new JList<>(new String[]{});
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// Treat double click on list as select+OK press.
if (e.getClickCount() == 2) {
okClicked = true;
setVisible(false);
}
}
});
content.add(list, constraint);
// Add Cancel button below list and in left column.
constraint.gridwidth = 1;
constraint.fill = GridBagConstraints.NONE;
constraint.gridy = 1;
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// OK not clicked here! Let flag alone.
setVisible(false);
}
});
content.add(cancel, constraint);
// Add OK button below list and in right column.
constraint.gridx = 1;
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
okClicked = true;
setVisible(false);
}
});
content.add(ok, constraint);
// Replace default content pane with our JPanel.
setContentPane(content);
}
// Fill the list in the dialog with fresh values.
public void initialize(final String [] vals) {
list.setModel(new AbstractListModel<String>() {
@Override public int getSize() { return vals.length; }
@Override public String getElementAt(int index) { return vals[index]; }
});
pack(); // Resize to fit contents.
setLocationRelativeTo(getOwner()); // Position in middle of parent.
}
public boolean getOkClicked() {
return okClicked;
}
public String getSelectedString() {
String val = list.getSelectedValue();
return (val == null) ? "[none]" : val;
}
}
关于java - JDialog 未针对新输入进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15648364/
如何在另一个 JDialog 中添加 JDialog? 最佳答案 JDialog secondDialog = new JDialog(this); // ("this" is the first J
我有一个 JDialog,其中有一个可打开新窗口的按钮。我想要做的是每当其他窗口打开时阻止此 JDialog。当我说阻止时,我的意思是用户无法操纵它,无法移动它或最大化或任何东西。 顺便问一下,对于带
我有一个从 JFrame 上的按钮打开的父 JDialog。父 JDialog 本身有一个从父对话框上的按钮打开的子 JDialog。当我关闭父对话框并使用框架上的按钮再次打开它时,我不希望子对话框也
抱歉这个奇怪的标题,但这是解释。所以我有一个带有学生列表的 StudentRepository 类,这些学生是在 GUI 上选择的(通过 TableModel)。学生对象的属性是: int stude
我有一个未修饰的模态 JDialog,当用户在模态对话框外单击时,我想将其设置为 setVisible(false)。 这在 Swing 中可能吗? 我正在做的是为日期选择器之类的文本字段弹出一个自定
我有一个模式设置对话框,它是一个 JDialog。在这个设置窗口中,我放置了一些组件,包括一个按钮到另一个模态设置对话框,它也是一个 JDialog。我制作了它们 JDialogs,因为这是我所知道的
我只想在单击 JDialog 之外时关闭 JDialog import javax.swing.JDialog; import javax.swing.JLabel; public class Dia
我正在尝试重现我在多个应用程序中看到的功能:我有一个带有多个 JDialog 的 GUI 应用程序。我想轻松地将它们紧密地组织在屏幕上:当我移动一个 JDialog,并且它的一个边界变得“接近”(例如
对 Java 相当陌生,并且遇到了 z 顺序问题。我有一个旧版 Java 应用程序,它有一个主窗口 A,它会弹出一个模式 JDialog B。单击 B 上的按钮后,会弹出一个模式对话框 C。 对于从
我的应用程序中有多个 JDialogs 存储在 map 中。这些JDialogs都有 setModel(false); 当这些对话框失去焦点并且我想将特定的 JDialog 带到前面时,所有 JDia
我有一个扩展 JDialog 的类。当 JDialog 显示时,我单击其启动 Jframe 的显示按钮,但在关闭 JDialog 之前我无法访问 JFrame。当屏幕上存在 JDialog 时,如何访
场景是这样的我的 JFrame 有一个按钮,单击它会打开一个 JDialog,它是一个模型对话框。JDialog 有另一个按钮,我想打开另一个 JFrmae 点击它打开。 结果:另一个 Jframe
我有一个带有主 JFrame 的小型应用程序,它以模态方式打开 JDialog。在这个 JDialog 中,我启动了一个 javax.swing.Timer,它应该在 JDialog 关闭时停止。 p
如何将用户凭据传回到包含的 JFrame,以便 JFrame 知道特定用户? JFrame 有一个 main 方法。 包含的 JFrame 能否以某种方式从 Dialog 中获取用户? 当jbtOk
我基本上创建的是一个 JDialog,它在表单上有一个关键事件。因此,当例如按下空间时,它会做一些事情。在我在同一个对话框上创建一个可编辑的 JTextArea 之前,这种方法工作得很好。当我这样做时
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在构建我的第一个 gui,到目前为止一切正常,除了 JDialog 的故障。 .它在第一次使用时相应地接受名称和进程列表。但是当我把它拉回来输入新的输入时,它仍然没有响应。我认为这不是线程问题,因
如何创建一个 Modal JDialog,在任务正在处理时显示“正在加载”,并在超过 3 秒后显示? 最佳答案 为了扩展 Paul 的回答,SwingWorker 可以很好地运行您的后台任务。然后您可
该程序大部分运行正常,但没有打开任何窗口。它应该在桌面右下角显示一个小对话框。但是对于另一个人来说,编译相同的代码没有问题。我们有相同的 Java 运行时 (1.8_u40)。我该如何解决这个问题?
我正在使用 Eclipse 的 Window Builder 插件。 当我执行以下代码时,它正确显示JDialog。我原本希望 JDialog 也能显示在设计选项卡中(在设计时),但它不会。 pack
我是一名优秀的程序员,十分优秀!