【问题标题】:add components to a panel in Java在 Java 中将组件添加到面板
【发布时间】:2011-08-31 18:47:02
【问题描述】:

我正在创建一个小程序,它由一个扩展 JApplet 的类、一个菜单栏和一个扩展 JPanel 的类组成。(所以小程序中显示了一个菜单栏和一个 JPanel)。

在这个类中,我向 JPanel 添加和删除一些文本字段。这一切都很好。这就是它变得棘手的地方:它只在第一次工作。当我向 JPanel 添加一些新的文本字段时,它们会被添加并在 JPanel 中可见,但 JFrame 中的菜单栏停止工作。

由于代码过于庞大,我只发布其中的一部分。

这是我将 JPanel 添加到 JApplet 的代码:

public class Simulator extends JApplet implements ItemListener, ActionListener {
    Container pane = getContentPane();
    canvas = new DrawCanvas();
    pane.add(canvas, BorderLayout.LINE_END);
}

这是 JPanel 的代码:

class DrawCanvas extends JPanel {
    public void paintComponent(Graphics g) {
        if(textfield != null)
            remove(textfield);
        textfield = new JTextField();
        this.add(textfield);
    }
}

这第一次有效(没有删除任何内容),但第二次菜单栏停止工作。 当我省略 this.add(textfield);行,菜单栏继续工作。

【问题讨论】:

  • “菜单栏停止工作”是什么意思?你还能点击一些项目吗?可能是子菜单在您新添加的文本字段后面呈现...
  • 您不应在paintComponent() 中添加和删除文本字段。 paintComponent 仅用于绘制组件!
  • @Jeroen 您仍然可以打开菜单,但不显示子菜单。仔细观察后,我注意到只有在打开菜单时才会出现的一条小蓝线,所以我猜它们确实被渲染在其他东西后面。但是文本字段不妨碍菜单。这是一张图片:link

标签: java components add japplet


【解决方案1】:

我曾经遇到过类似的问题,即在其他组件后面绘制弹出菜单。 尝试在您的特定子菜单上调用静态JPopupMenu.setDefaultLightWeightPopupEnabled(false);setLightWeightPopupEnabled。这将使(所有)弹出菜单(即子菜单)成为具有本地对等点的重量级组件。

【讨论】:

  • 我打电话给(menu.getPopupMenu()).setLightWeightPopupEnabled(false); 解决了所有问题。谢谢!
【解决方案2】:

我相信您遇到了线程问题。 在绘制过程中添加和删除 JComponents 可能会弄乱 EDT(它首先调用了绘制方法)。

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多