Java 在重新绘制方法时在GUI中添加组件

Java 在重新绘制方法时在GUI中添加组件,java,swing,user-interface,paint,Java,Swing,User Interface,Paint,我对javagui的理解没有我想象的那么好。在我的画框方法中,我希望擦除所有当前按钮,并添加新按钮。(总体目标是提供一个界面,用户可以看到角色并单击按钮下载与角色相关的文档。由于每个角色都不同,当用户从我的列表中选择一个新用户时,他们将可以使用一组新的文档和按钮。) 这是我刚刚写的一个测试框架,它显示了事情的发展方向。它有我在实际程序中使用的类似范例,没有太多混乱: public class GUITest extends JFrame { /** * @param args */ pub

我对javagui的理解没有我想象的那么好。在我的画框方法中,我希望擦除所有当前按钮,并添加新按钮。(总体目标是提供一个界面,用户可以看到角色并单击按钮下载与角色相关的文档。由于每个角色都不同,当用户从我的列表中选择一个新用户时,他们将可以使用一组新的文档和按钮。)

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

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的顶部,但是调用后,什么也不会显示。我不知道为什么,因为我正在适当地添加组件,对吗

编辑

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


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

永远不要在GUI中添加组件或删除paint或paint Component方法中的组件。不要这样做。曾经句号

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

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

编辑
关于


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

我会使用JList保存左侧的可选信息列表,并使用ListSelectionListener对其做出反应。在侦听器中,我将更改相关的显示信息。我也避免在Swing中使用KeyListener,而是倾向于键绑定,因为它们在焦点方面更灵活、更不僵硬

关于


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

我不知道你在这里做什么或者你想做什么


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

因此,与其“绘制”按钮,为什么不直接更改那里的文本(setText(…)


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

谢谢!!!这很有道理,因为疯狂的事情正在发生,比如按钮有时会出现,但其他按钮不会出现。在这种情况下,还有什么替代方案?我确实有一些关键侦听器,它们可以在不必单击按钮的情况下打开文档,但是我应该如何让客户端能够单击某些按钮或类似对象呢?我只是选择了一个糟糕的设计吗?或者,是否有适用于这种情况的“轻量级”组件?@Sal:请提供更多详细信息。我不完全理解你的问题是什么,你的程序有什么困难。明白了,让我给你一个更详细的分类。一个客户端通过查看西面板上游戏中的角色列表来导航我的程序。他们可以从列表中选择一行,该行将在东面板上显示字符详细信息。细节是图像和描述。最近,我添加了这个特殊字符的相关文档,它将显示在东面板的底部。我创建了key listener,这样客户机可以通过按num键快速查看文档,但我还想让他们能够单击按钮启动pdf