# 解决常见的组件问题

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

本节讨论使用组件时可能遇到的问题。如果您在本节中未发现问题，请参阅以下部分：

*   [使用其他摆动功能解决常见问题](../misc/problems.html)
*   [解决常见布局问题](../layout/problems.html)
*   [解决常见事件处理问题](../events/problems.html)
*   [解决常见的绘画问题](../painting/problems.html)

**问题：**我在实现模型时遇到了问题（或者其他一些类似于 Java SE Platform，Standard Edition 中已有的代码）。

*   查看 Java SE 源代码。它与 JDK 一起分发，是查找实现模型，触发事件等的代码示例的绝佳资源。

**问题：**每当文本字段中的文本更新时，文本字段的大小都会更改。

*   您应该通过指定应显示空间的列数来指定文本字段的首选宽度。为此，可以使用`JTextField`构造函数的`int`参数或`setColumns`方法。

**问题：**内容窗格的某些区域在重新绘制时看起来很奇怪。

*   如果设置内容窗格，请确保它不透明。您可以通过在内容窗格上调用`setOpaque(true)`来执行此操作。请注意，尽管`JPanel`在大多数外观和感觉上都是不透明的，但在 GTK +外观中并非如此。有关详细信息，请参阅[将组件添加到内容窗格](toplevel.html#contentpane)。
*   如果您的一个或多个组件执行自定义绘制，请确保正确实现它。有关帮助，请参见[解决常见绘画问题](../painting/problems.html)。
*   您可能遇到线程安全问题。请参阅下一个条目。

**问题：**我的程序表现出奇怪的症状，有时似乎与时间有关。

*   确保您的代码是线程安全的。有关详细信息，请参阅 Swing 中的[并发。](../concurrency/index.html)

**问题：**我的模态对话框在其他窗口后丢失。

*   如果对话框具有空父组件，请在创建时将其设置为有效的框架或组件。
*   此错误已在 6.0 版本中修复。有关更多信息，请参见 [4255200](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4255200) 。

**问题：**滚动条策略似乎没有像宣传的那样工作。

*   某些 Swing 版本包含`VERTICAL_SCROLLBAR_AS_NEEDED`和`HORIZONTAL_SCROLLBAR_AS_NEEDED`策略的实现中的错误。如果您的项目可行，请使用最新版本的 Swing。
*   如果滚动窗格的客户端可以动态更改大小，程序应设置客户端的首选大小，然后在客户端上调用`revalidate`。
*   确保您为预期的方向指定了预期的策略。

**问题：**我的滚动窗格没有滚动条。

*   如果要始终显示滚动条，请根据需要为滚动条策略指定`VERTICAL_SCROLLBAR_ALWAYS`或`HORIZONTAL_SCROLLBAR_ALWAYS`。
*   如果希望滚动条显示为需要，并且您希望在创建滚动窗格时强制需要滚动条，则有两种选择：设置滚动窗格或其容器的首选大小，或实现滚动-savvy 类并从`getPreferredScrollableViewportSize`方法返回小于组件标准首选大小的值。有关信息，请参阅[调整滚动窗格](scrollpane.html#sizing)的大小。

**问题：**我的分割窗格中的分隔符不会移动！

*   您需要在拆分窗格中设置至少一个组件的最小大小。有关信息，请参阅[定位分频器和限制其范围](splitpane.html#divider)。

**问题：** `JSplitPane`的`setDividerLocation`方法不起作用。

*   如果拆分窗格没有大小，则`setDividerLocation(double)`方法无效（如果它尚未在屏幕上，则通常为 true）。您可以使用`setDividerLocation(int)`或指定拆分窗格包含的组件的首选大小，也可以指定拆分窗格的调整大小。有关信息，请参阅[定位分频器和限制其范围](splitpane.html#divider)。

*   如果嵌套分割窗格，则边框会累积 - 内部分割窗格的边框显示在外部分割窗格的边框旁边，从而导致边框看起来格外宽。嵌套许多分割窗格时，问题尤其明显。解决方法是在放置在另一个拆分窗格中的任何拆分窗格上将边框设置为 null。有关信息，请参阅 Java Bug 数据库中的错误＃ [4131528](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4131528) 。

**问题：**工具栏中的按钮太大了。

*   尝试减少按钮的余量。例如：

    ```
    button.setMargin(new Insets(0,0,0,0));

    ```

 我的分层窗格中的组件未正确分层。事实上，这些层似乎是倒置的 - 深度越低，组件越高。

*   如果在将组件添加到分层窗格时使用`int`而不是`Integer`，则会发生这种情况。要查看发生了什么，在`LayeredPaneDemo`类中，将
    `layeredPane.add(label, new Integer(i));`
    更改为
    `layeredPane.add（标签， **i** ）;` 。

**问题：**方法调用 `_colorChooser_ .setPreviewPanel（null）`不会按预期删除颜色选择器的预览面板。

*   `null`参数指定默认预览面板。要删除预览面板，请指定一个没有大小的标准面板，如下所示： `_colorChooser_ .setPreviewPanel（new JPanel（））;`