# 使用其他摆动特征解决常见问题

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/misc/problems.html](https://docs.oracle.com/javase/tutorial/uiswing/misc/problems.html)

**问题：**我的应用程序没有显示我通过`UIManager.setLookAndFeel`请求的外观。

您可能要么将外观设置为无效的外观，要么在 UI 管理器加载默认外观后设置它。如果你确定你指定的外观是有效的并且设置外观是你的程序做的第一件事（例如，在它的 main 方法的顶部），检查你是否有一个引用 Swing 的静态字段类。如果没有指定，则此引用可以导致加载默认外观。有关更多信息，包括如何在创建 GUI 后设置外观，请参阅[外观](../lookandfeel/plaf.html)部分。

**问题：**为什么我的组件没有得到关注？

*   它是您创建的自定义组件（例如，`JComponent`的直接子类）吗？如果是这样，您可能需要为组件提供输入映射和鼠标侦听器。有关详细信息和演示，请参阅[如何使自定义组件可聚焦](focus.html#focusable)。
*   组件是否在`JWindow`对象中？聚焦系统要求`JWindow`的拥有框架对`JWindow`对象中的任何组件可见，以获得焦点。默认情况下，如果没有为`JWindow`对象指定拥有框架，则会为其创建一个不可见的拥有框架。解决方案是在创建`JWindow`对象时指定可见且可聚焦的拥有帧，或者使用`JDialog`或`JFrame`对象。

**问题：**为什么我的对话框无法收到用户点击 Escape 键时生成的事件？

如果对话框包含文本字段，则可能正在使用该事件。

*   如果你想获得 Escape 事件而不管组件是否消耗它，你应该使用 [``KeyEventDispatcher``](https://docs.oracle.com/javase/8/docs/api/java/awt/KeyEventDispatcher.html)。
*   如果只想在组件未使用它时获取 Escape 事件，则使用`WHEN_IN_FOCUSED_WINDOW`输入映射在`JDialog`对象中的任何`JComponent`组件上注册键绑定。有关更多信息，请参见[如何使用键绑定](../misc/keybinding.html)页面。

**问题：**为什么我不能将 Swing 组件应用到托盘图标？ `TrayIcon`类的当前实现支持`PopupMenu`组件，但不支持其 Swing 对应`JPopupMenu`。此限制缩小了使用其他 Swing 功能的功能，例如菜单图标。请参阅错误 ID [6285881](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6285881) 。

*   将创建一个新的`JTrayIcon`类来消除这种不便。在此之前，使用 AWT 组件添加菜单项，复选框菜单项或子菜单。

如果您在本节中未找到问题，请参阅[解决常见组件问题](../components/problems.html)。