天道酬勤,学无止境

Block entire swing ui except for one component - "dialog style"

[This question is in relation to this question]

Setting: I have this home-crafted "editable label" component which looks like a label, but when you click it, it turns into an editable field, allowing you to edit it. You can hit Esc to cancel, or Shift-Enter to OK your edits - or click the respective buttons beneath the editable field.

The challenge: When you go into this edit-mode, I want the rest of the UI to be completely blocked: You shall either cancel or OK the edit before being able to do anything else. While writing this, I realize the obvious: This is exactly how a dialog operates - but I like my "in-document" edit-label better than opening a dialog.

评论

Glass pane might be the way to go. You can easily steal all the events and send some to your custom object. Here is an article that discusses a way to implement A wellbehaved glasspane.

This is rough. There is no method in Swing to block all UI except for one component. This is something you will have to build out yourself. Here is the design approach I would use:

  • Build a EditableLabelListener interface defining the method editableStateChanged(EditableLabelEvent)

  • Create a EditableLabelEvent class which extends AWTEvent and adds an editableState property and an isEditable() boolean value.

  • Add methods to your custom component for addEditableLabelListener and removeEditableLabelListener

  • On each panel where you use your component, have your controller class (which may be your panel, depending on your design) implement EditableEventListener and register itself as a listener to the component.

  • When the event is fired, the controller class should check the isEditable method on the event, and enable or disable all other components on the panel as appropriate. When there are multiple editable label components on the same form, you can use the getSource method on the event to determine which one is being used so you can disable the others.

In you editable label, when you start editing, use SwingUtilities.getRoot() to get the root of your label, cast it to Container. On the Container you can call getComponents(). Iterate through this array and call setEnabled(false) unless it is the label. Enable them when you're done editing.

One question: why do you need it? If you need dialog-like behavior, use JOptionPane.

BTW, if you remove border from JTextField and setOpaque(false), it will be just as an editable label.

You can extend a JDialog, then when you init it,

this.setAlwaysOnTop(true);
this.setModalityType(ModalityType.APPLICATION_MODAL);
this.setVisible(false);
this.setVisible(true);

It will only allow the JDialog to be interacted with and block everything else in the application.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • “Whiteout”整个swing GUI,除了一个组件("Whiteout" entire swing GUI except from one component)
    问题 【这个问题与这个问题有关】 设置:我有这个自制的“可编辑标签”组件,它看起来像一个标签,但是当您单击它时,它会变成一个可编辑字段,允许您对其进行编辑。 您可以按 Esc 取消,或按 Shift-Enter 来确定您的编辑 - 或单击可编辑字段下方的相应按钮。 挑战:当点击编辑时,我希望整个 UI 都“变白”,除了编辑标签的区域,向用户清楚地表明他应该关注的地方。 回答1 或者,这可以使用 JXLayer 项目来实现。 看看他们的一些演示,在选择物品时,他们会在其中模糊GUI。 您必须实现自己的 JXLayer 视图才能使 GUI 变白。 项目网址:https://jxlayer.dev.java.net/ 演示位于首页的“入门”项下。 回答2 你可以看看玻璃面板的可能用途...... 由于问题作者的评论而更新。 这种问题通常由 Look'n'Feel 的个人实现来解决。 通常,需要屏幕的组件将具有为此目的设置的客户端属性。 为该组件创建了渲染组件的 LnF 也注册了一个监听器。 设置此属性后,LnF 将接收的组件将触发一个事件。 在活动接待处,然后在整个容器框架上安装一块玻璃板。
  • "Whiteout" entire swing GUI except from one component
    [This question is in relation to this question] Setting: I have this home-crafted "editable label" component which looks like a label, but when you click it, it turns into an editable field, allowing you to edit it. You can hit Esc to cancel, or Shift-Enter to OK your edits - or click the respective buttons beneath the editable field. The Challenge: When hitting edit, I want the entire UI to be "whited out", except for the edit-label's area, to clearly denote to the user where it is expected that he should focus.
  • Java:Swing库和线程安全(Java: Swing Libraries & Thread Safety)
    问题 我经常听到对Swing库中缺乏线程安全性的批评。 但是,我不确定自己将在自己的代码中执行的操作可能会导致问题: 在什么情况下,Swing不是线程安全的事实起作用? 我应该积极避免做什么? 回答1 切勿执行长时间运行的任务来响应按钮,事件等,因为这些事件都在事件线程上。 如果您阻止事件线程,整个GUI将完全不响应,从而使用户感到非常生气。 这就是为什么Swing看起来缓慢又硬朗。 使用线程,执行程序和SwingWorker运行不在EDT(事件调度线程)上的任务。 不要在EDT之外更新或创建窗口小部件。 在EDT之外,您唯一可以做的就是Component.repaint()。 使用SwingUtilitis.invokeLater以确保某些代码在EDT上执行。 使用EDT调试技术和智能的外观(例如检查EDT违规的Substance) 如果遵循这些规则,Swing可以制作一些非常吸引人的,具有响应性的GUI 一些非常出色的Swing UI工作示例:Palantir Technologies。 注意:我不为他们工作,只是一个很棒的挥杆例子。 不好意思,不要公开演示...他们的博客也很好,虽然稀疏,但是很好 回答2 这些问题之一使我很高兴我购买了Robinson&Vorobiev的Swing书。 任何访问java.awt.Component状态的内容都应在EDT内部运行
  • 恶补Java Swing线程刷新UI机制(由浅到深的参考大佬博文)
    1. java中进度条不能更新问题的研究 感谢大佬:https://blog.csdn.net/smartcat86/article/details/2226681 为什么进度条在事件处理过程中不更新,而是在完成后,从0%调到100%? 分两种情况: 1)在AWT事件线程中执行的操作 当 应用程序在事件线程中执行长时间的操作时,会阻塞正常的AWT事件处理,因此阻止了重绘操作的发生。这同常会在下列情况下发生:应用程序响应一个来自用户 界面的请求时,在连接到一个按钮或其他GUI组件的事件处理程序中执行任务,任务的内容可能会需要较长时间,使事件线程挂起,直至远程系统发出答复为止。 当应用程序调用JProgressBar的setValue方法时,进度条可能更新期内部状态并调用repaint,这样做会把一个事件放置到AWT事件 队列中。不幸的是,直至应用程序的事件处理程序完成其处理并把控制权返回到线程的事件处理循环,才能处理该事件。 可以通过调用JComponent的paintImmediately方法来这样做,该方法有两种形式: public void paintImmediately(int x, int y, int width, int height); public void paintImmediately(Rectangel rect); 例如: Dimension d =
  • Java Swing GUI Try/Catch块(Java Swing GUI Try/Catch Block)
    问题 我只是在学习 Java 异常处理和一般的 Java。 我制作了一个 Swing GUI,用户将在其中输入整数到两个字段中,然后单击带有算术函数的单选按钮,答案将出现在第三个文本字段中。 如果用户将前两个字段之一留空或输入整数以外的内容,我想包含一个 try/catch 块来捕获异常,如果用户试图除以零,则第二个捕获。 该表单可以正常工作,但不会捕获错误,只会返回堆栈跟踪并使程序崩溃。 我有一种感觉,我只是在错误的地方放置了 try/catch 块,但我移动它的次数越多,情况就越糟。 有人能指出我哪里出错了吗? import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.WindowConstants; import javax.swing.SwingUtilities; public class Main extends javax.swing
  • Why does a JTable view update block the entire GUI?
    I have a simple JTable, displaying many data (~1000 rows) with a complex custom cell renderer. It takes a little time to render this cells. During this time the entire GUI seems to be frozen. This can be seen, because a progress indicator is shown to the user. During data generation, it works normally. But if the JTable is triggered trough fireTableDataChanged to update its view, the progress indicator gets frozen. In the following little example, you should press on the button and see the effect after generating the data. The static waiting blocks (through Thread.sleep()) represent the
  • 为什么 JTable 视图更新会阻塞整个 GUI?(Why does a JTable view update block the entire GUI?)
    问题 我有一个简单的 JTable,使用复杂的自定义单元格渲染器显示许多数据(~1000 行)。 渲染这个单元格需要一点时间。 在此期间,整个 GUI 似乎都被冻结了。 这可以看出,因为向用户显示了进度指示器。 在数据生成过程中,它正常工作。 但是,如果通过fireTableDataChanged触发 JTable 以更新其视图,则进度指示器将被冻结。 在下面的小例子中,您应该按下按钮并查看生成数据后的效果。 静态等待块(通过Thread.sleep() )表示用于数据生成和表示生成的复杂现实世界代码。 我现在的问题是,我的错在哪里。 因为我不相信,没有可能解决这个问题。 澄清: 在我的应用程序中,每个单元格以不同颜色和图标的两行显示数据。 为了展示一个简单的例子,我只添加了 sleep 来表示创建和渲染所有这些单元格需要很长时间。 请注意,我的应用程序显示了大约 1000 个或 2000 个这两个具有不同颜色和图标的行单元格。 这需要很多时间来渲染。 由于这个简单的例子无法显示这种复杂性,我添加了睡眠(它应该代表复杂的工作)。 你问“为什么需要这么长时间?”。 正如我之前解释的那样,有数千个单元格,它们对每个单元格中的每个对象调用操作和显示设置。 实际上可能不会那么长,但为了显示我这次设置为特定 42 毫秒的问题。 我知道当我阻止 EDT 时 GUI 会冻结。 但我不知道
  • 使用用户界面(Swing)冻结在Java上启动ServerSocket的过程(Starting ServerSocket on Java with User Interface(Swing) Freezes)
    问题 再会, 我有一个ServerSocket的无限循环,工作正常...问题是当我尝试使用按钮启动ServerSocket时。 我的用户界面“冻结”什么都没有动,但服务器正常运行,这里有一个ScreenShot : http://i.gyazo.com/15d331166dd3f651fc7bda4e3670be4d.png 当我按下按钮“ Iniciar”时,表示启动服务器,用户界面冻结(ServerSocket无限循环)。 我无法更改我的代码,因为它可以正常工作。 public static void iniciarServer() { try { appendString("\nServidor iniciado."); System.out.println("asdasd"); } catch (BadLocationException e1) { e1.printStackTrace(); } try { ss = new ServerSocket(1234, 3); while (true) { System.out.println("Esperando conexiones..."); appendString("\nEsperando conexiones..."); Socket s = ss.accept(); System.out.println(
  • 如何在 Swing 中暂时禁用事件侦听器?(How to temporarily disable event listeners in Swing?)
    问题 我有一个带有模型和视图的 Swing 应用程序。 在视图 (GUI) 中有很多组件,每个组件都映射到模型对象的某个属性并显示它的值。 现在有一些 UI 组件会在 UI 中的值发生变化时自动触发某些模型属性的更新。 这需要我在 UI 中重新加载完整的模型。 这样我就进入了一个无限更新循环,因为 UI 中的每个模型重新加载都会触发另一个模型重新加载。 我有一个指示加载过程的标志,我想用它来暂时抑制侦听器通知,同时从模型设置 UI 字段。 所以我的问题是: 有没有办法在不删除和重新附加它们的情况下全局临时禁用 Swing 中某些组件的侦听器? 回答1 您可以为您的侦听器使用一个公共基类,并在其中使用一个静态方法来打开或关闭侦听器: public abstract class BaseMouseListener implements ActionListener{ private static boolean active = true; public static void setActive(boolean active){ BaseMouseListener.active = active; } protected abstract void doPerformAction(ActionEvent e); @Override public final void
  • 涉及Swing和AWT-EventQueue的无响应线程(Unresponsive threading involving Swing and AWT-EventQueue)
    问题 我有一个没有响应的应用程序,似乎处于死锁或类似死锁的状态。 请参阅下面的两个线程。 请注意, My-Thread@101c线程阻止了AWT-EventQueue-0@301 。 但是, My-Thread刚刚调用了java.awt.EventQueue.invokeAndWait() 。 因此, AWT-EventQueue-0阻止了My-Thread (我相信)。 My-Thread@101c, priority=5, in group 'main', status: 'WAIT' blocks AWT-EventQueue-0@301 at java.lang.Object.wait(Object.java:-1) at java.lang.Object.wait(Object.java:485) at java.awt.EventQueue.invokeAndWait(Unknown Source:-1) at javax.swing.SwingUtilities.invokeAndWait(Unknown Source:-1) at com.acme.ui.ViewBuilder.renderOnEDT(ViewBuilder.java:157) . . . at com.acme.util.Job.run(Job.java:425) at java.lang
  • JavaFX Block the UI (and the code) until a server call is finished
    This topic is around in countless articles of "not blocking the JavaFX UI during a long lasting call into something time consuming (server)". I know that and I googled and tried a lot. Most of the "Internet" explains that long lasting calls caused by JavaFX events need to be made in an extra thread. After the thread is finished, you update the FX UI with the results via Platform.runLater(). Most of the FX Libraries encapsulate this with sophisticated code constructs (really cool stuff). My current problem with it is: We are migrating a Swing rich client to JavaFX. It is a huge one, so we have
  • 高分辨率(MS Surface)上的糟糕的Swing UI缩放(Bad Swing UI scaling on high resolution (MS Surface))
    问题 我目前正在开发一个涉及 Swing GUI 的小型 Java 应用程序。 在我的开发 PC 上,一切看起来都很好,但是当我在 MS Surface 上运行它时,有些图标对于组件来说似乎太大(或者对于图标来说组件太小)。 这就是我的意思: 谷歌的研究让我得出结论,这是由于 Surface 的高分辨率和 Win8 的缩放让某些项目看起来更大一些。 所以我将该缩放重置为 100%,它实际上修复了错误的缩放比例。 不幸的是,这并不能真正解决我的问题。 没有缩放,一切都太小了,所以我宁愿不禁用它。 但是有没有什么聪明的方法来解决这个问题? 我可以“取消缩放”我的程序或 Java 的图标吗? 理想情况下,我什至希望升级整个框架,因为一切都很小。 编辑:显然,我也尝试调整实际 JFrame 的大小,但它对对话框大小没有影响。 我正在调用对话框 JOptionPane.showMessageDialog(frame, msg, "Information", JOptionPane.INFORMATION_MESSAGE); 顺便一提。 回答1 这是一个讨厌的、笨拙的、快速修复的解决方案,它将通过将 Swing 自己的图标大小调整为 80% 来阻止令人讨厌的裁剪。 在main ,添加以下内容: String[] iconOpts = {"OptionPane.errorIcon",
  • 在事件调度线程上构造SWING / AWT小部件是否安全?(Is it safe to construct Swing/AWT widgets NOT on the Event Dispatch Thread?)
    问题 我一直在将Substance外观集成到我的应用程序中,并且遇到有关内部EDT(事件调度线程)检查例程的几个问题。 物质绝对拒绝在EDT之外构造UI类。 我已经做了很多Swing / AWT,并且我了解有关EDT的大多数规则。 我使用SwingWorker,SwingUtilties.invokeLater修改组件。 我总是尽管可以在EDT之外构造这些组件,但是必须在EDT上实现和操纵这些组件。 换句话说,您可以在后台构造和设置默认值,但是对pack / setVisible的调用必须是EDT,以及随后的任何操作该组件的调用。 我问的原因是,我要构建一个特别的“漂亮”窗口,其中涉及许多小部件,状态和资源(很多图标)。 以前,我是在SwingWorker的背景方法上构建窗口的,并在done方法中使该窗口可见。 从来没有一个问题。 切换到Substance后,内部EDT检查就使我难过。 我已经能够重构代码来解决这个问题。 我可以在EDT上构建一个不好的解决方案,因为整个应用程序都会阻塞。 我还可以进行更多重构,并尽力将所有额外的资源加载到EDT之外。 打包...在事件调度线程上构造SWING / AWT小部件是否安全? 回答1 Sun在2004年更改了规则-在此之前,您被允许在EDT之外创建组件,并且仅在实现该组件后才可以进入EDT。 现在,新规则为: 为了避免发生死锁
  • JavaFX 阻止 UI(和代码)直到服务器调用完成(JavaFX Block the UI (and the code) until a server call is finished)
    问题 这个主题在无数关于“在长时间调用耗时(服务器)期间不阻塞 JavaFX UI”的文章中都有提及。 我知道这一点,我用谷歌搜索并尝试了很多。 大多数“互联网”解释说,需要在额外的线程中进行由 JavaFX 事件引起的持久调用。 线程完成后,您可以通过 Platform.runLater() 使用结果更新 FX UI。 大多数 FX 库都用复杂的代码结构(非常酷的东西)封装了这一点。 我目前的问题是:我们正在将 Swing 富客户端迁移到 JavaFX。 这是一个巨大的,所以我们必须不断地在其中包含/替换 JavaFX UI,直到它成为一个完整的 FX 客户端。 客户端中有一些功能可以执行服务器调用,并且必须等待用户才能继续他的工作。 服务器使用带有无状态会话 bean 和接口的 JEE6。 接口是客户端已知的,并且通过我们自己的一个小库,我们实现了一个小代理,对客户端隐藏了通信层。 客户端只需使用库创建一个“RemoteProxy”,然后调用远程接口,库将调用传播到服务器。 调用该方法并将结果或异常传输回客户端。 对于客户端,这看起来像是本地呼叫。 这是问题所在。 一个典型的代码片段如下所示: ... ServerRemoteInterface myServerRemoteProxy = Helper.getProxyForInterface
  • 当违反 Swing 的线程策略时会发生什么?(What happens when Swing's threading policy is violated?)
    问题 在过去的几年里,我主要在 Eclipse 中进行 UI 开发,这在线程访问方面非常保守:任何尝试从 UI 线程外部更改 UI 小部件上的属性(例如,颜色、文本)都会引发异常. 我现在正在查看 Swing 中的一个现有程序,它有一个带有大量自定义小部件的窗口。 有一个单独的线程为这些小部件中的每一个运行一个变异函数,变异函数读取一些东西的值(例如,标签颜色和值)并写入一些东西(例如,改变背景颜色)。 请注意,没有涉及自定义绘画或类似的东西,只是对其包含的子小部件进行了一系列更改,这些小部件主要是 JLabels。 目前,这从单独的线程运行,而不是从 Swing 事件线程运行。 该线程遍历所有 400 个小部件,并在每个小部件上调用 mutator。 更新似乎工作正常,但 GUI 对用户输入没有响应。 如果我从 Swing 线程外部运行大约 0.4 毫秒的整个过程,并将对 mutator 的每个调用都包装在 invokeLater 或 invokeAndWait 中,那么 UI 的响应速度会快得多。 我想了解的是: 1) 从 Swing 线程外部进行所有这些调用有时是否合法? 2) 对 Swing 线程有什么影响,为什么当我从外部调用它时 UI 响应较慢? 回答1 从“无”到间歇性问题,再到“一切都坏了,让每个人都去处理 GUI!” 主要(最明显)的视觉效果是,如果您举起 GUI
  • Is it safe to construct Swing/AWT widgets NOT on the Event Dispatch Thread?
    I've been integrating the Substance look and feel into my application and ran into several problems regarding it's internal EDT (Event Dispatch Thread) checking routines. Substance absolutely refuses to construct UI classes outside of the EDT. I've done plenty of Swing/AWT and I know most of the rules regarding the EDT. I use SwingWorker, SwingUtilties.invokeLater to modify components. I always though that components could be CONSTRUCTED outside of the EDT, but must be realized and manipulated on the EDT. In other words, you can construct and setup defaults in the background but the call to
  • Scala Swing 中的监听器和反应(Listeners and reactions in Scala Swing)
    问题 我已经在 Eclipse 中进行了相当多的搜索和一些试验和错误,但是在使用 Swing 在 Scala 中编写 GUI 时,我对听众和反应的理解似乎存在差距。 每个侦听器是否都会获得一个反应块,或者我是否在所有可能生成事件的组件上注册侦听器,并使用 case 语句对大型反应块中的每个组件做出反应? 监听器和反应块到底属于哪里。 这是我的 GUI 代码的缩写版本: import scala.swing._ import scala.swing.event.ButtonClicked import scala.swing.event.KeyTyped import scala.swing.event.KeyPressed object HumanGUI extends SimpleGUIApplication { val basicPane = new java.awt.Dimension(800, 200) val botPane = new java.awt.Dimension(400, 200) val felt = new java.awt.Color(35, 125, 35) def top = new MainFrame { title = "Blackjack GUI" val ConnectionPanel = new BoxPanel(Orientation
  • Swing应用程序初始化和加载屏幕方法(Swing application initialization and loading screen approach)
    问题 我制作了很多各种各样的Swing应用程序,它们的加载时间通常在几秒钟到几分钟之间,具体取决于应用程序UI /数据大小。 同样在某些情况下,应用程序数据加载与UI加载混合在一起。 几秒钟的加载时间不是问题,但是当它比我们说的10秒长时-很明显,应该显示某种类型的加载屏幕,直到UI /数据完全初始化为止。 通常要执行的操作-首先创建某种类型的加载屏幕(例如,带有徽标和在应用程序加载时正在更新的标签的窗口),然后从应用程序中的各个加载“点”进行更新。 问题是-应用程序通常在排队到EDT的单个调用中加载,并且很难在不使应用程序代码复杂化的情况下将其分成对EDT的多次调用。 因此,由于应用程序加载是在排队到EDT的单个调用中执行的,因此您根本无法正确更新加载屏幕-由于EDT忙于加载应用程序,因此在应用程序初始化之前不会显示更新。 因此,为了在某些情况下实现加载屏幕,我将应用程序UI初始化移到了EDT之外,并以在执行加载时不进行任何UI更新的方式进行设计。 应用程序的框架显示和所有应用程序UI操作仍将在EDT中执行。 通常这不太好,但是经过大量测试并仔细研究了Swing代码,我确信即使在大型应用程序上,它也不会引起任何问题。 不过,即使这样做不会引起任何问题,通常也不是一件好事。 所以问题是:在将应用程序初始化保持在EDT中的同时,可以使用哪些方法正确显示和更新应用程序加载屏幕?
  • How to change the Font in the entire Swing UI application
    I have made a swing application. Now I want to change the Font of entire Swing Application , so that any component being added should follow that Font only. Is there any way to achieve the same ?
  • 如何获得 Java 输出屏幕?(How to get the Java Output screen?)
    问题 我正在尝试使用 Graphics 在屏幕上显示图像,但屏幕无法加载 出现输出屏幕但只显示黑屏而不显示图像 代码被正确编译,为什么我没有得到输出 package game; import java.awt.*; import javax.swing.JFrame; public class Screen { private GraphicsDevice vc; public Screen(){ GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); vc=env.getDefaultScreenDevice(); } public void setFullScreen(DisplayMode dm, JFrame window){ window.setUndecorated(true); window.setResizable(false); vc.setFullScreenWindow(window); if(dm !=null && vc.isDisplayChangeSupported()){ try{ vc.setDisplayMode(dm); }catch(Exception ex){} } } public Window getFullSCreenWindow(){