2017-05-25 18 views
1

我工作的RCP应用程序这是从一个Swing版本过渡的内容。所以我们有很多UI组件在这个转换过程中仍然需要在Swing世界中生存。我能够将现有的Swing组件正确放置在AWT-SWT桥接框架中。刷新Eclipse RCP的一部分时,桥变化

我裹在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组件具有这样当用户点击一个按钮的行为,那是隐藏在组件东西变得可见,或新UI元素被添加到Swing组件。例如:

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组件中的元素发生变化时,父桥帧无法正确呈现。

当第一次创建的部分,我的应用程序是这样的: before

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

但是,当我甚至开始调整含部分绦一点,正确含桥梁帧更新部分:after resizing

我能做些什么,使含桥梁帧更新部分自动更新?

为了检验这是否是桥车架上的重画的问题,我有可能会触发桥车架的repaint/revalidate/pack一个菜单项,但这并没有解决问题。我怀疑它是与含有部分的渲染,但不知道如何去解决它。

+0

在猜测(因为我不使用桥)尝试'embed.layout(真,真)' –

+0

@格雷格-449的感谢!不幸的是,这并没有起作用(或任何“布局”,“重绘”等变体)。 – anishthecoder

回答

0

我最终解决该问题得到了由定制ControlListener/ComponentListener连接到包含桥接部的部分。如果桥框架的工作范围内的任何变化导致其调整到超出了父母,我有听众调整大小以适应内因此,母体迫使滚动窗格接管。

这里是我的听众:

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(); 
    } 
} 

这不是一个完美的解决方案;我仍然接受其他想法来解决这个问题。

1

同样的问题存在于纯摇摆的解决方案:

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()

+0

我尝试了Swing元素和SWT元素上的布局/重绘/重新验证方法的许多变体,无济于事...... – anishthecoder

+0

对此具体示例,您是对的。道歉;我正在回应我的原始应用程序。在我的实际应用中,我对嵌入式框架内发生的事情没有太多控制。所以我不能根据需要调用“doLayout”。此外,它可能与'LayoutManager'有关。在我这里的简单例子中,BorderLayout的表现非常好。但是,我的实际应用程序通常对嵌入式组件使用'MigLayout',这些组件在内部添加时可能表现不一样。 – anishthecoder