Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当桥的内容更改时,刷新包含AWT-SWT桥的Eclipse RCP部件_Java_Eclipse_Rcp_E4_Swt Awt - Fatal编程技术网

Java 当桥的内容更改时,刷新包含AWT-SWT桥的Eclipse RCP部件

Java 当桥的内容更改时,刷新包含AWT-SWT桥的Eclipse RCP部件,java,eclipse,rcp,e4,swt-awt,Java,Eclipse,Rcp,E4,Swt Awt,我正在开发一个RCP应用程序,它正在从Swing版本过渡。因此,我们有很多UI组件,在这个过渡期间仍然需要生活在Swing世界中。我能够将现有的Swing组件正确地放置在AWT-SWT桥接框架中 在将这些Swing组件添加到桥接器之前,我将它们包装在一个JScrollable窗格中,这样当Swing UI元素的大小改变时,我就不必调整包含它们的部分的大小。在零件中放置旧Swing组件的代码如下所示: @PostConstruct public void postConstruct(final C

我正在开发一个RCP应用程序,它正在从Swing版本过渡。因此,我们有很多UI组件,在这个过渡期间仍然需要生活在Swing世界中。我能够将现有的Swing组件正确地放置在AWT-SWT桥接框架中

在将这些Swing组件添加到桥接器之前,我将它们包装在一个JScrollable窗格中,这样当Swing UI元素的大小改变时,我就不必调整包含它们的部分的大小。在零件中放置旧Swing组件的代码如下所示:

@PostConstruct
public void postConstruct(final Composite parent) {

    /* Create embedding composite */
    final Frame bridgeFrame;
    final Composite embed;
    embed = new Composite(parent, SWT.EMBEDDED);
    embed.setLayout(new FillLayout());
    bridgeFrame = SWT_AWT.new_Frame(embed);
    bridgeFrame.setLayout(new BorderLayout());
    bridgeFrame.add(
            new JScrollPane(getTestPanel()),
            BorderLayout.CENTER);
}
我的Swing组件具有这样一种行为:当用户单击按钮时,隐藏在组件中的内容将变为可见,或者向Swing组件添加新的UI元素。例如:

private JPanel getTestPanel() {
    final JPanel output;
    final JButton eastBttn, westBttn;
    output = new JPanel();
    eastBttn = new JButton("East Button");
    westBttn = new JButton("West Button");
    output.setLayout(new BorderLayout());
    output.add(eastBttn, BorderLayout.EAST);
    output.add(westBttn, BorderLayout.WEST);

    eastBttn.addActionListener(evt -> {
        System.out.println("East Button Clicked");
        output.add(new JLabel("East Button Clicked"), BorderLayout.CENTER);
    });

    return output;
}
我的问题是,当Swing组件中的元素发生更改时,父桥框架无法正确渲染

首次创建部件时,我的应用程序如下所示:

在我点击
east按钮之后
应该在桥框的中心添加一个文本标签。但是,应用程序视图中没有任何更改

但是,当我甚至开始稍微调整包含部分窗扇的大小时,包含桥接框架的部分会正确更新:

如何使包含零件的桥接器框架更新自动更新?


为了测试这是否是桥接器框架上的重新绘制问题,我有一个菜单项,它将触发桥接器框架的
重新绘制
/
重新验证
/
,但这并没有解决问题。我怀疑它与包含部分的渲染器有关,但不知道如何着手解决它

在纯Swing解决方案中也存在同样的问题:

public static void main(String[] args) {
    JFrame bridgeFrame = new JFrame("Test");
    bridgeFrame.setSize(400, 400);
    bridgeFrame.setLayout(new BorderLayout());
    bridgeFrame.add(new JScrollPane(getTestPanel()), BorderLayout.CENTER);

    bridgeFrame.setVisible(true);
}

您需要在事件处理程序中添加一个
output.doLayout()

我最终解决了这个问题,将一个自定义的
ControlListener
/
组件监听器
附加到包含桥接的部分。如果桥接框架工作中的任何更改导致其调整大小超出父级,我会让侦听器调整其大小以适应父级,从而强制滚动窗格接管

下面是我的听众:

public class BridgeComponetAdapter
        extends ComponentAdapter
        implements ControlListener {

    private final Composite parent;
    private final Frame bridgeFrame;
    private Point parentSize;

    public BridgeComponetAdapter(
            final Composite parent,
            final Frame bridgeFrame) {
        this.parent = parent;
        this.bridgeFrame = bridgeFrame;
        bridgeFrame.addComponentListener(this);
        parent.addControlListener(this);
    }

    @Override
    public void componentResized(final ComponentEvent e) {
        System.out.println(e);
        if (e.getSource() != bridgeFrame)
            return;

        final Dimension currentBridgeSize;
        currentBridgeSize = bridgeFrame.getSize();
        if (currentBridgeSize.getWidth() > parentSize.x
                || currentBridgeSize.getHeight() > parentSize.y) {
            bridgeFrame.setSize(parentSize.x, parentSize.y);
        }
    }

    @Override
    public void controlMoved(final ControlEvent e) {}

    @Override
    public void controlResized(final ControlEvent e) {
        System.out.println(e);
        if (e.getSource() == parent)
            parentSize = parent.getSize();
    }
}

这不是一个优雅的解决方案;我仍然愿意接受其他解决这个问题的办法

猜一猜(因为我没有使用桥接器),试试
embed.layout(真的,真的)
@greg-449谢谢!不幸的是,这不太管用(或
布局
重画
,等等的任何变体。我在Swing元素和SWT元素上尝试了许多布局/重绘/重新验证方法的变体,但都没有效果…关于这个特定示例,您是对的。抱歉;我是在查看我的原始应用程序时做出响应的。在我的实际应用程序中,我没有这样就可以控制嵌入框架内发生的事情。因此,我无法根据需要调用
doLayout
。此外,它可能与
LayoutManager
有关。在我这里的简化示例中,BorderLayout表现得非常好。然而,我的实际应用程序经常使用
migayout
作为嵌入式组件在内部添加组件时,组件的行为可能不同。