我并不像我想的那样理解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视图并查看文档内容。
由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的相应标题。这是重绘的行为奇怪的地方。你给了我一个很好的解释,但是我不知道如何让客户端访问文档,除了绘制doc的描述以及启动它所需的热键。这有意义吗?
答案 0 :(得分:7)
从不 将组件添加到GUI或删除paint或paintComponent方法中的组件。只是不要这样做。永远。期。
这些方法仅用于绘图,需要尽可能快,否则您的程序将显示无响应。不仅如此,您无法完全控制何时或甚至是否会调用这些方法,因此程序逻辑和结构不应该进入这些方法。
使用ActionListeners,ListSelectionListeners或键绑定等事件侦听器对用户事件做出反应。
修改强>
关于
知道了,让我给你一个更详细的细节。客户端通过查看西面板上游戏中的角色列表来导航我的程序。他们可以从列表中选择一行,在东面板上显示字符详细信息。细节是图像和描述。最近,我为该特定字符添加了相关文档,该字符将显示在东面板的底部。我创建了关键监听器,因此客户端可以通过按下num键快速查看文档,但我也想让他们能够单击按钮启动pdf视图并查看文档内容。
我使用JList来保存左侧的可选信息列表,并使用ListSelectionListener对它做出反应。在监听器中,我将更改相关的显示信息。我也避免使用带有Swing的KeyListeners,而是倾向于Key Bindings,因为它们更灵活,对焦点不那么刻板。
关于
由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的相应标题。这是重绘的行为奇怪的地方。你给了我一个很好的解释,但是我不知道如何让客户端访问文档,除了绘制doc的描述以及启动它所需的热键。这有意义吗?
我不确定你在这里做什么或者你想做什么。
答案 1 :(得分:3)
由于每个字符都有不同的相关文档和不同数量的文档,因此我每次都重新绘制按钮,以反映相关文档的数量和文档的相应标题。这是重绘的行为奇怪的地方。你给了我一个很好的解释,但是我不知道如何让客户端访问文档,除了绘制doc的描述以及启动它所需的热键。这有意义吗?
所以不要再“画”按钮,为什么不改变那里的文字(setText(...))。
当用户选择“char”时。您将需要重建部分屏幕。更改列表模型(如上所述)并删除/添加文档容器上所需的任何按钮。