4

我并不像我想象的那样理解 Java GUI。在我的框架绘制方法中,我想擦除所有当前按钮,并添加新按钮。(总体目标是有一个界面,用户可以看到角色并点击按钮下载与角色相关的文档。由于每个角色都不一样,当用户从我的列表中选择一个新用户时,一组新的文档和按钮将可供他们使用。)

这是我刚刚编写的一个测试框架,它显示了事情的发展方向。它具有我在实际程序中使用的类似范例,没有太多混乱:

public class GUITest extends JFrame
{

/**
 * @param args
 */
public static void main(String[] args)
{
    Container gui_test = new GUITest();

}

private JComponent content = null;

public GUITest()
{
    super();

    setVisible(true);
}

public void paint(Graphics g)
{
    this.removeAll();

    content = new JPanel();

    JComponent test_button = new JButton("New Button 1");
    JComponent button = new JButton("New Button 2");

    content.add(button);
    content.add(test_button);

    this.add(content);

    super.paint(g);
}

}

如果没有调用 removeAll(),按钮将继续被抛出到 JPanel 之上,但是调用之后,什么都不会显示。我不知道为什么会这样,因为我正在适当地添加组件,对吗?

编辑
知道了,让我给你一个更详细的细分。一位客户正在通过查看西面板上游戏中的角色列表来导航我的程序。他们可以从列表中选择一行,该行将在东面板上显示字符详细信息。详细信息是图像和描述。最近,我为该特定字符添加了相关文档,它将显示在东面板的底部。我创建了按键监听器,因此客户端可以通过按 num 键快速查看文档,但我也想让他们能够单击按钮以启动 pdf 视图并查看文档的内容。

由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的适当标题。这就是重绘表现奇怪的地方。你给了我一个很好的解释,说明出了什么问题,但我现在不知道如何让客户访问文档,除了绘制文档的描述以及启动它所需的热键。那有意义吗?

4

2 回答 2

7

永远不要在您的 GUI 中添加组件或删除 paint 或 paintComponent 方法中的组件。只是不要这样做。曾经。时期。

这些方法仅用于绘图,并且需要尽可能快,否则您的程序将显得无响应。不仅如此,您无法完全控制何时甚至是否调用这些方法,因此程序逻辑和结构不应进入这些方法。

而是使用事件侦听器(例如 ActionListeners、ListSelectionListeners)或键绑定对用户事件做出反应。

编辑
关于

明白了,让我给你一个更详细的细分。一位客户正在通过查看西面板上游戏中的角色列表来导航我的程序。他们可以从列表中选择一行,该行将在东面板上显示字符详细信息。详细信息是图像和描述。最近,我为该特定字符添加了相关文档,它将显示在东面板的底部。我创建了按键侦听器,因此客户端可以通过按 num 键快速查看文档,但我也想让他们能够单击按钮启动 pdf 视图并查看文档的内容。

我会使用 JList 来保存左侧的可选信息列表,并使用 ListSelectionListener 对其做出反应。在监听器中,我会更改相关的显示信息。我也避免将 KeyListeners 与 Swing 一起使用,而是倾向于使用 Key Bindings,因为它们在焦点方面更灵活且不那么僵化。

关于

由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的适当标题。这就是重绘表现奇怪的地方。你给了我一个很好的解释,说明出了什么问题,但我现在不知道如何让客户访问文档,除了绘制文档的描述以及启动它所需的热键。那有意义吗?

我不确定你在这里做什么或你想做什么。

于 2012-07-14T00:29:19.723 回答
3

由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的适当标题。这就是重绘表现奇怪的地方。你给了我一个很好的解释,说明出了什么问题,但我现在不知道如何让客户访问文档,除了绘制文档的描述以及启动它所需的热键。那有意义吗?

因此,与其“绘制”按钮,不如直接更改文本 (setText(...))。

当用户选择“char”时。您将需要重建屏幕的某些部分。更改列表模型(如上所述)并删除/添加文档容器上所需的任何按钮。

于 2012-07-14T02:10:26.650 回答