问题标签 [swing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
23487 浏览

java - 查找 Swing/AWT 对象的“真实”高度/宽度

因为 Canvas3D 无法使用父框架动态调整大小,所以我希望能够跟踪用户何时调整窗口大小,然后自己手动调整窗口大小。(如果这最终导致 Canvas3D 崩溃,正如一些文档所建议的那样,我将在用户调整其窗口大小时简单地销毁并重新创建它)。此过程的一部分涉及能够准确地判断容器面板的大小。

我试过的两种方法:

似乎没有准确地报告事情:getHeight()总是为零,并getPreferredSize()返回实际上与面板的实际大小没有任何关系的数字。

有任何想法吗?

编辑:因此,我将调试器带到面板对象并手动检查了非对象属性,但没有看到任何类似于宽度/高度的东西。当然,有些子对象我没有看过。另外,当我查询高度/对象时,也许窗口必须是可见的(它不是,在我连接对象的时候)?

编辑 2:所以,Swing 类是 AWT 类的子类,所以我想如果你能够找到这些类的高度/宽度,那么这种方法就会泛化。我已经相应地修改了标题。

0 投票
5 回答
2309 浏览

java - 我必须在 Webstart 应用程序中显式调用 System.exit() 吗?

最近我将一个 Swing 应用程序转换为 Webstart。这个过程非常简单,但我发现在我关闭所有窗口后,我的应用程序的 JVM 并没有终止。线程转储显示有几个非守护线程,特别是 Swing 的 EDT、AWT 和几个 websart 相关线程。

实际使用的策略是每个窗口在创建时递增一个计数器,在关闭时递减一个。默认关闭操作是 DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有 JNI 资源。

当我从 bat 文件(相同的 JAR)启动应用程序时,它在所有窗口都关闭时正常终止,所以我认为问题与 Webstart 有关。

现在的问题:

  1. 谁能告诉我到底发生了什么?为什么 Webstart 会留下僵尸 JVM?
  2. 有没有办法在不停止 JVM 的情况下显式释放 Webstart 资源?
  3. 我一直认为调用 System.exit() 会鼓励草率的做法,即不释放您的资源并依赖操作系统在您之后进行清理(如果您稍后重用代码,这可能会导致令人讨厌的意外)......我错过了什么吗?

另请参阅后续问题以检测 Webstart 是否已启动该应用程序。

0 投票
5 回答
90939 浏览

java - 如何在屏幕上居中 JDialog?

如何将 JDialog 定位在屏幕中央?

0 投票
3 回答
2655 浏览

java - Swing 组件的开源改进或替换

我使用 Swing 开发了许多桌面 Java 应用程序,虽然 Swing 非常强大(一旦你掌握了它的窍门),仍然有很多情况我希望一些高级组件开箱即用。

例如,我真的很想看到易于使用的组件(不用自己编写,只要有足够的时间我就可以做到),例如:

  • 多行标签
  • 类似于 Windows 文件资源管理器的图标或缩略图视图
  • 下拉按钮(类似于 Firefox 的旧后退按钮)
  • 5 星评级小部件
  • 具有自动历史记录的组合框(如 Google 上的文本字段)
  • Outlook 风格的手风琴风格的酒吧
  • 等等

我知道一些免费的 Swing 组件的来源,例如SwingLabs、JXTable 的主页、JXDatePicker 和其他一些。

除了 Java 本身包含的 Swing 组件之外,您还去哪里寻找 Swing 组件?

0 投票
3 回答
596 浏览

java - 自定义 Swing 组件 - 将节点变成文本

我正在编写一个自定义摆动组件(全新的东西,但想想 JTree 或 JList)。我正在尝试遵循 JTree、JTable、JList 等的总体设计以保持一致性(我还看到各种糟糕的第 3 方组件放弃了可分离模型和/或渲染器方法)。

所以,我有一个充满节点的模型、组件本身和一个渲染器。在某些时候,必须将节点转换为文本并由渲染器显示。我不清楚最好的方法:

  • 将节点本身(作为对象)传递给渲染器,让渲染器决定如何显示它。
    • 这就是 JList 的做法。
    • 需要一个定制的渲染器来改变文本。
    • 在如何显示节点方面具有很大的灵活性(甚至不必是文本)。
  • 将节点本身(作为对象)传递给渲染器,但在组件类中有一个 convertValueToText() 方法。
    • 这就是 JTree 的工作方式。
    • 渲染器可以像以前一样灵活——不必使用这种方法。
    • 必须重写组件才能更改文本转换。
  • 如上所述,但将 convertValueTotext() 委托给模型。
    • 这就是 JXTable 的工作方式。
    • 该模型可能是这种方法的最佳位置 - 并且在那里更容易覆盖。

我不想仅仅为了更改文本而自定义渲染器,但我希望能够自定义渲染器来做的不仅仅是显示模型显示的字符串(否则为什么要使用渲染器)。我真的不喜欢 JXTable 使用反射在模型中查找 convertValueToText() 的事实——这对我来说是一种不好的魔法。

谁能解释一下 Swing 这个经常被忽视的部分?

解决方案

我最终做的是:

  • 向模型添加一个方法,该方法返回给定节点的字符串。重要的是,这可以为 null 以指示渲染器应该知道该做什么,或者我们根本无法提供任何有用的东西。
  • 该组件具有相同的方法,并将调用传递给模型。这对于视图模型分离很重要。渲染器调用此方法,因此它不直接与模型对话。
  • 默认渲染器调用上述方法,如果它不为空,则使用它,否则它可以在值上调用 toString,或提供默认值,或其他。

这让开发人员在他们想要覆盖显示的值时有一个选择 - 使用非空返回值覆盖该方法,因为他们知道默认渲染器将显示此文本。- 提供一个自定义渲染器,它传递实际的节点对象,以便它可以在需要时做“聪明”的事情。

我对它很满意——它“感觉”不错,它有效,而且易于使用。

感谢您的观点!

0 投票
14 回答
157444 浏览

java - 如何动态更改 JFrame 内的 JPanel?

简单地说,有一个简单的 java swing 应用程序,它由 JFrame 和一些组件组成。其中一个组件是一个 JPanel,它旨在在用户操作时被另一个 JPanel 替换。

那么,做这种事情的正确方法是什么?我试过了

但这行不通。你有什么建议?

0 投票
3 回答
6123 浏览

java - 如何减少GridLayout中JCheckboxes之间的空间

JCheckboxes在一列中有三个 Java,通过将容器的布局设置JPanelGridLayout(3, 1, 1, 1). 当我运行程序时,JCheckBoxes 之间的垂直空间太大;它看起来超过 1 个像素。由于我已经将布局中 JCheckbox 之间的垂直间距设置为 1 像素,我还能如何减少这些 JCheckbox 之间的垂直间距?

谢谢。

0 投票
1 回答
11965 浏览

java - 如何使用 Java (Swing) 获取标题栏的高度?

我正在使用MouseEventJava。该getPoint()方法是将标题栏的高度添加到坐标的 y 部分。

我想知道如何找到当前窗口标题栏的高度,以便将 y 值偏移正确的量。

0 投票
5 回答
914 浏览

java - Java Swing 应用程序到 OSX 的可移植性

最近,我编写了一个非常基本的 Java Swing 程序,其中包含几个文本字段和按钮。该程序在带有 Java 1.5 的 Ubuntu 上运行良好。但是当我尝试在 OSX (10.4) 上运行它时,主窗口显示正确,但程序似乎没有响应。无论我点击哪个按钮,似乎都没有发生任何事情。

我对 Mac OSX 几乎一无所知,所以我可能做错了什么吗?

0 投票
1 回答
2119 浏览

java - 根据 JDialog 调整 JPanel 的大小

我有一个JDialog包含一系列的JPanelsa CardLayout。其中一些面板包含JTables我希望根据JDialog. 我不知道如何实现这一点,任何帮助将不胜感激。

目前,这些表格只是保持其当前大小并且不缩放。我确定它很简单,但我无法找到所需的确切方法。

提前谢谢了。如果需要,我会提供更多信息。

编辑:JDialog用作向导,因此任何时候都只显示一个面板,因此使用CardLayout. 理想情况下,我希望将其保留为布局管理器,尽管如果它是问题的根源,那么显然我会重新考虑!