【问题标题】:JFrame doesn't update its contentJFrame 不更新其内容
【发布时间】:2016-04-24 07:11:15
【问题描述】:

我一直在努力让我的 JFrame 重新绘制其内容。在将新组件添加到 JFrame 后,我尝试同时使用 revaluate() 和 repaint() 方法,但我没有看到框架发生变化。

这是我正在尝试制作的扫雷游戏的简单 GUI。

当用户点击前 3 个按钮中的任何一个时,他们会输入以下代码块

private void drawGrid()
{
        removeAll();

        setLayout(new GridLayout(2,1));
        add(new JButton("button"));

        setVisible(true);

        revalidate();
        repaint();
        setVisible(false);
        setVisible(true);
}

单击按钮时,整个应用程序变为白色,但我看不到我添加的新按钮。当我删除两个 setVisible() 方法行时,单击一个按钮肯定会删除组件,因为我现在无法单击它们中的任何一个,但 4 个初始按钮仍然可见。删除 revalidate 或 repaint 方法对应用程序没有影响。

我还能尝试什么来让应用程序刷新并显示其新内容。

【问题讨论】:

    标签: java swing user-interface awt


    【解决方案1】:

    JFrame 上调用removeAll 是危险的,可能会产生意想不到的结果,这也是不鼓励直接在顶级容器上扩展或管理 UI 的另一个原因。

    首先使用 JPanel 作为基本 UI 组件,然后使用 CardLayout 管理视图之间的切换。

    将每个视图分成自己的类(从JPanel 或类似的东西扩展)以便于管理

    【讨论】:

    • 我尝试创建一个 JPanel,然后将所有菜单按钮插入该面板,然后将 JPanel 添加到主 JFrame,但 GUI 显示为 4 个按钮挤入顶部的 2x2 网格JFrame 的一半,即使我已将 JPanel 的布局设置为 4x1 网格
    • 如何将所有按钮插入到单独的 JPanel 中,然后将 JPanel 添加到主 JFrame 中,并在视觉上与我目前的结果相同。
    • 确保JFrame 的布局设置为BorderLayout,确保“菜单”面板的布局设置为GridLayout,1 列0 行。您的菜单不需要有单独的面板,它们可以在单个面板上进行管理,例如,您的游戏视图应该是一个单独的面板,然后您可以更轻松地管理代码,而不是尝试动态始终从单个类动态生成对象
    【解决方案2】:

    如果你使用它可能会更好

    easyBtn.setVisible( false );
    medBtn.setVisible( false );
    hardBtn.setVisible( false );
    customBtn.setVisible( false );
    newBtn.setVisible( true );
    

    如果这不起作用,请尝试将其放入 SwingWorker。

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 2016-09-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多