【问题标题】:Pack a JMeter Gui打包一个 JMeter Gui
【发布时间】:2026-02-03 08:15:01
【问题描述】:

我正在尝试使用 this API 为我的 JMeter 插件制作一个 GUI

当创建太多JComponent 对象时,我希望我的AbstractSamplerGui 滚动。如果我创建一个包含简单对象的面板,我没有问题.. 面板将滚动正常:

import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;

...

public final class MyGui extends AbstractSamplerGui {
    public MyGui() {
        final VerticalPanel panel = new VerticalPanel();
        for (int i = 0; i < 100; i++) {
            panel.add(new JLabel("TEST"));
            panel.add(new JTextArea());
        }
        add(panel);
    }
    ...

但是,当我给 JTextArea 对象一个非默认大小 new JTextArea(30, 30)) 时,滚动条不会注意到页面更大.. 意味着一半的项目延伸到面板之外(无法到达)。

我知道您应该在添加项目后通过JFrame 致电pack,但我不知道我该怎么做。 AbstractSamplerGui 扩展 JPanel 没有 pack 方法。

我尝试使用 JMeter API 找到 JFrame,但没有运气。我也不认为我可以使用 SwingUtilities::getRoot 找到根框架,因为这项工作是在 JPanel 的构造函数中完成的。

任何帮助将不胜感激!

【问题讨论】:

  • Why does anyone use swing? - 因为它易于使用和定制。缺乏关于 Swing 的知识并不是抱怨它的理由。问题在于您的自定义代码,而不是 Swing。谁知道为什么你的代码不起作用。 “VerticalPanel”是一个非标准类,我不知道它的作用。布局问题可能就在那里。
  • @camickr 它更像是一个滑稽的评论:p VerticalPanel 也是 JMeter API 的一部分。我将添加导入
  • @camickr 我刚刚用JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 替换了panel,我看到了同样的问题。

标签: java swing user-interface jmeter pack


【解决方案1】:

我刚刚将面板替换为 JPanel panel = new JPanel();

是的,但我们不知道 AbstractSamplerGui 在做什么。它可能对组件的宽度有一些限制。

我也不认为我可以使用 SwingUtilities::getRoot 找到根框架,因为这项工作是在 JPanel 的构造函数中完成的。

您可以尝试将AncestorListener 添加到您的面板。 ancestorAdded 事件应在面板添加到可见 GUI 时生成。然后你应该能够得到父窗口,这样你就可以打包它了:

@Override
public void ancestorAdded(AncestorEvent e)
{
    JComponent component = e.getComponent();

    Window window = SwingUtilities.windowForComponent(component);

    window.pack();
}

【讨论】:

  • 刚刚尝试过,不幸的是它没有解决问题。我不确定 JMeter 在幕后做了什么来导致这种行为;也许包装不是我问题的实际原因......我会继续调查。感谢您的回复:)