我有一个独立的 Java 应用程序,它从数据库中获取数据并将其显示在 JTable 中。当应用程序启动时,系统会在 JDialog 中提示用户输入用户名/密码。输入正确的凭据后,将显示包含数据的主 JFrame。在主 JFrame 上,我有一个注销按钮,单击该按钮时,应关闭主 JFrame 并重新显示登录 JDialog。除了我发现单击注销按钮时主 JFrame 不会消失外,一切都正常。下面是我的代码的一个小示例:
主.java:
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame();
}
});
}
}
MainFrame.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MainFrame extends JFrame implements ActionListener {
private JButton button;
private MyDialog dialog;
public MainFrame() {
super("this is the JFrame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dialog = new MyDialog(this);
button = new JButton("click me to hide this JFrame and display JDialog");
button.addActionListener(this);
add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false); // works when changed to dispose();
dialog.setVisible(true);
}
}
MyDialog.java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class MyDialog extends JDialog implements ActionListener {
private JFrame parentFrame;
private JButton button;
public MyDialog(JFrame parentFrame) {
super(parentFrame, "this is the JDialog", true);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
this.parentFrame = parentFrame;
button = new JButton("click me to hide JDialog and show JFrame");
button.addActionListener(this);
add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
parentFrame.setVisible(true);
}
}
在 MainFrame.java 中,如果我将显示 setVisible(false) 的行更改为 dispose() 那么当我将 JFrame 消失时单击按钮。我的问题是,为什么这适用于 dispose() 而不是 setVisible(false)?有没有更好的方法来组织我的代码?我是 Swing 的新手,所以如果这是一个基本问题,我深表歉意。谢谢。
已编辑 2011-10-19 10:26 PDT
谢谢大家的帮助。我将 JDialog 更改为具有 null parent,现在一切正常。
最佳答案
查看启动 JDialog 的行:
dialog = new MyDialog(this);
您设置的框架与对话框所在的父框架相同。你看,对话框不能单独出现,它必须位于父框架之上。
所以在你的代码中,当你写:
setVisible(false); // works when changed to dispose();
dialog.setVisible(true);
在第一行中,您告诉框架消失,然后您告诉对话框出现,这实际上是告诉对话框出现在其父框架上。由于父框架是相同的,因此它看起来对您保持可见。如果你删除第二行,我相信框架会消失。但是,当您告诉框架进行处置时,它会完全消失,因为您不仅告诉它失去可见性,而且还将其自身从内存中删除。
然后,当您告诉对话框出现时,它会查找其 JFrame(已被处置),重新初始化并打开。
解决问题的方法是为 JDialog 创建一个单独的新 JFrame。然后不要使用 dispose,只使用 setVisible 命令。
-阿萨夫
关于Java Swing dispose() 与 setVisible(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814758/
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案
显然在Test::Unit中没有assert_false。您将如何通过扩展断言并添加文件config/initializers/assertions_helper.rb来添加它?这是最好的方法吗?我不想修改test/unit/assertions.rb。顺便说一句,我不认为这是多余的。我使用的是assert_equalfalse,something_to_evaluate。这种方法的问题是很容易意外使用assertfalse,something_to_evaluate。这将始终失败,不会引发错误或警告,并且会在测试中引入错误。 最佳答案
我总是遇到这个Ruby问题,我想把它写得更干净。varacanbenila.valuecanalsobenila.valuehaspossibletrueorfalsevalueif(nota.nil?)&&(nota.value.nil?)&&a.value==falseputs"avalueisnotavailable"elseputs"avalueistrue"end问题在于条件语句过于笨拙且难以阅读。如何改进检查nil和false条件语句?谢谢,我是Ruby新手 最佳答案 Rubyonrails有一个叫做try的扩展,它允许
所以我一直在努力解决我一直遇到的这个错误,我终于找到了导致它的原因。我一直觉得,当我调用@my_model.save(false)我会跳过我的ActiveRecord验证。事实证明这是部分正确的。我的对象正在保存到数据库中DESPITE我的ActiveRecord验证。我的问题存在是因为我的一个验证在验证过程中修改了一个子模型(这是一个24小时位置的调度应用程序,因此当午餐被保存时,我对照他们保存的那天和第二天检查它们以及确保用户不是指“凌晨2点”表示要上夜类。我的问题是:有没有办法真正跳过我的验证并直接移动到数据库?这是正常的ActiveRecord行为还是我应该更深入地研究我的验证
我一直在研究运算符优先级,有人向我解释说x=!5返回false。我似乎无法再次向自己解释原因。我知道=!不是运算符,所以x和5仍然存在。那么这是否意味着Ruby不知道该做什么?如果是这样,ruby应该返回一个错误,因为x可能没有值?Ruby会在运算符处停止,然后将false的值赋给x吗?x=!5=>false 最佳答案 这是因为x=!5被解释为x=(!5)(!hashigerprecedencethan=)。在Ruby中,除了nil和false之外,每个对象都是true。5具有真实值,您正在使用运算符!取反。因此false作为结果被
ruby1.9.3dev(2011-09-23修订版33323)[i686-linux]轨道3.0.20最近为什么在与DateTimeonRails相关的RSpecs项目上工作我发现在给定日期以下语句发出的值date.end_of_day.to_datetime和date.to_datetime.end_of_day虽然它们表示相同的日期时间,但比较时返回false。为了确认这一点,我打开了Rails控制台并尝试了以下操作1.9.3dev:053>monday=Time.now.monday=>2013-02-2500:00:00+05301.9.3dev:054>monday.cla
要求“rubygems”给出false,但要求“appium_lib”给出true。即,require'rubygems'#=>falserequire'appium_lib'#=>true这样可以吗?这不像试图要求一些实际上不存在的东西,即:require'does_not_existxxxxxxx'#=>LoadError:cannotloadsuchfile--does_not_existxxxxxxx 最佳答案 应该没问题。第二次请求文件会导致错误响应。对于load,这是另一回事,它会在每次请求时load(require)文
当你想将一个变量v转换成false时,当它是nil/false和true否则,有一个简单的方法:!!v但是当v为nil/false时,是否有一种简单的方法将v转换为nil并保留否则它的值(value)? 最佳答案 你可以使用||=:a='hello'a||=nil#=>"hello"a=truea||=nil#=>truea=falsea||=nil#=>nila=nila||=nil#=>nil 关于ruby-将`false`转换为`nil`,我们在StackOverflow上找到一个
我正在使用Ruby的case语法来设置一些基于self.class的简单逻辑,如下所示:caseself.classwhenFirstClassdostuff....whenSecondClassdootherstuff...end我很快意识到这总是返回nil。经过仔细调查,我发现case使用===而不是==检查是否相等。在我的终端中运行self.class==FirstClass时,我按预期得到true,但是self.class===FirstClass返回假的。查看ruby文档,我找到了followingexplanation===:CaseEquality–ForclassO