Eclipse SWT 中用于循环组合的 Java 侦听器

Posted

技术标签:

【中文标题】Eclipse SWT 中用于循环组合的 Java 侦听器【英文标题】:Java Listener for looped combo in Eclipse SWT 【发布时间】:2018-01-21 17:28:24 【问题描述】:

我有一个使用 Eclipse 构建的 Java SWT GUI。我正在使用 while 循环来引用文本文件。 while 循环遍历文本文件的每一行,并为每一行的特定项目构建一系列组合或文本框。每行代表 GUI 中的一个可视列,并且根据我在文本文件中有多少项目,GUI 构建到右侧。为简单起见,我只包括我想弄清楚的代码。

例如,假设我有三行在 GUI 中创建六个组合框(三列乘两行)。我想在第二列的顶行进行更改,以在底行(也在第二列)执行侦听器。然而,现在监听器循环遍历所有组合并对所有三个进行更改,而不仅仅是我想要的那个。我不知道如何使这项工作。请参阅下面的代码。感谢您的帮助。

private void buildMultipleSatPulldowns() 
    try 
        FileReader fr = new FileReader("MultipleSatellites.txt");
        BufferedReader br = new BufferedReader(fr);

        String line = null;
        String[] tempS;
        String constellation = null;
        String satellite = null;

        while ((line = br.readLine()) != null) 
            tempS = line.split("~");
            constellation = tempS[4];
            satellite = tempS[6];

            constNameCombo = new Combo(satellitesComposite2, SWT.NONE);
            constNameCombo.setToolTipText("Pulldown constellation name");
            constNameCombo.setBounds(startX + x2, 71, 125, 28);
            constNameCombo.setItems(constNameArray);
            constNameCombo.setText(constellation);
            constNameCombos.add(constNameCombo);

            constNameCombo.addModifyListener(new ModifyListener()  // captures changed combo values
                public void modifyText(ModifyEvent arg0) 
                    setConstellationPD();
                
            );

            sPullDown(constellation); // builds the satellite array for the constellation and populates each pulldown

            satNameCombo = new Combo(satellitesComposite2, SWT.NONE);
            satNameCombo.setToolTipText("Pulldown satellite name");
            satNameCombo.setBounds(startX + x2, 106, 125, 28);
            satNameCombo.setItems(satNameArray);
            satNameCombo.setText(satellite);
            satNameCombos.add(satNameCombo);

            startX = startX + nextX;

        

        br.close();

     catch (Exception ex) 
        ex.printStackTrace();
    


private void setConstellationPD() 

    int constellations = 0;

    for (Combo constNameCombo : constNameCombos) 

        // What do I do here so that only the desired satNameCombo changes to reflect the desired pull down?

        setSatellitesPD(constellations, constNameCombo)

        constellations++;
    



private void setSatellitesPD(int c, String cN) 
    int satellites = 0;

    for (Combo satNameCombo : satNameCombos) 
        if (c == satellites) 
            satNameCombo.setText(satNameCombos.get(satellites).toString());
            satNameCombo.removeAll();
            sPullDown(cN);
            satNameCombo.setText("select Satellite");
        
        satellites++;
    



private void sPullDown(String cName) 
    // sPullDown takes the constellation name and returns a String Array of all objects in the constellation. This code works correctly when called.

【问题讨论】:

作为旁注,您应该真正考虑使用Layouts。如果你在不同的平台上以不同的字体大小运行代码,使用 setBounds 会导致问题。 我会检查的。谢谢。 【参考方案1】:

如果我理解正确,您需要一种方法来知道哪个组合触发了事件以影响其他一些组件。

ModifyEvent 这样的SWT 事件有getSource() 方法,它将返回发生事件的对象。

您只需要正确识别它;例如,您可以简单地使用constNameCombos.indexOf(eventCombo) 来检索其索引。

或者,更有效的是,您可以使用 setData 方法将一些数据附加到您的组合中,并使用 getData 在事件中检索它,例如在循环中:

// "i" would be the index of the combo
constNameCombo.setData("index", i);
i++;

在事件中:

Combo eventCombo = (Combo) arg0.getSource();
int index = eventCombo.getData("index");

有了这些信息,您应该能够确定您想要更改的其他组件。

【讨论】:

使用你给我的东西,我能够让它按需要工作。非常感谢您的帮助。

以上是关于Eclipse SWT 中用于循环组合的 Java 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

swt是啥文件

无法打开eclipse,出现如下错误

java中SWT是否已经过时了,没有swing好用哦?

使用SWT Java创建NSPopover

如何验证 java swt text中输入的时间格式是不是正确

java SWT/Rap 计算器版本2(键盘鼠标兼容)