Java SWT按钮:删除现有按钮并添加新按钮

Java SWT按钮:删除现有按钮并添加新按钮,java,button,swt,Java,Button,Swt,我想根据您在菜单中单击的内容动态添加按钮 我的问题是,当我在菜单中选择一个新选项并取消选择第一个选项时,第一个选项将保持打开状态,新选项将在其下渲染 如何动态删除和添加新按钮 到目前为止,我的代码是: table.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { final ArrayList<ArrayList<St

我想根据您在菜单中单击的内容动态添加按钮

我的问题是,当我在菜单中选择一个新选项并取消选择第一个选项时,第一个选项将保持打开状态,新选项将在其下渲染

如何动态删除和添加新按钮

到目前为止,我的代码是:

    table.addListener(SWT.Selection, new Listener() {
        public void handleEvent(Event event) {
            final ArrayList<ArrayList<String>> displaySentences = new ArrayList<ArrayList<String>>();
            final ArrayList<ArrayList<String[]>> displayDiphones = new ArrayList<ArrayList<String[]>>();

            for (int i = 0; i < table.getItemCount(); i++) {
                TableItem item = table.getItem(i);
                if (item.getChecked()) {
                    displaySentences.add(new ArrayList<String>());
                    displayDiphones.add(new ArrayList<String[]>());
                    for (int j = 0; j < sentences.get(i).size(); j++) {
                        displaySentences.get(displaySentences.size() - 1).add(sentences.get(i).get(j));
                        displayDiphones.get(displayDiphones.size() - 1).add(diphones.get(i).get(j));
                    }
                }
            }

            int x = 180;
            int y = 10;
            int w = 50;
            for (int i = 0; i < displaySentences.size(); i++) {
                for (int j = 0; j < displaySentences.get(i).size(); j++) {
                    final Button button = new Button(shell, SWT.PUSH);
                    w = setButtonWidth(displaySentences.get(i).get(j));
                    button.setBounds(x, y, w, 25);
                    button.setText(displaySentences.get(i).get(j));
                    button.setData(displaySentences.get(i).get(j), new int[] { i, j });
                    x += w;
                    if (x > 700) {
                        x = 180;
                        y += 25;
                    }
                    button.addListener(SWT.Selection, new Listener() {
                        public void handleEvent(Event e) {
                            switch (e.type) {
                            case SWT.Selection:
                                int[] a = (int[]) button.getData(button.getText());

                                for (int k = 0; k < displayDiphones.get(a[0]).get(a[1]).length; k++) {
                                    final Button buttonDiphone = new Button(shell, SWT.PUSH);
                                    buttonDiphone.setBounds(180 + k * 30, 100, 30, 25);
                                    buttonDiphone.setText(displayDiphones.get(a[0]).get(a[1])[k]);
                                    buttonDiphone.setData(displayDiphones.get(a[0]).get(a[1])[k], randomInteger());

                                    buttonDiphone.addListener(SWT.Selection, new Listener() {
                                                public void handleEvent(
                                                        Event e) {
                                                    switch (e.type) {
                                                    case SWT.Selection:
                                                        txtConsole.setText(buttonDiphone.getText() + ": " + buttonDiphone.getData(buttonDiphone.getText()));
                                                        break;
                                                    }
                                                }
                                            });
                                }

                                break;
                            }
                        }
                    });
                }
            }
        }
    });
table.addListener(SWT.Selection,new Listener()){
公共无效handleEvent(事件){
final ArrayList DisplaySequences=新ArrayList();
final ArrayList displayDiphones=新ArrayList();
对于(int i=0;i700){
x=180;
y+=25;
}
addListener(SWT.Selection,newlistener()){
公共无效handleEvent(事件e){
开关(e型){
案例SWT.选择:
int[]a=(int[])button.getData(button.getText());
for(int k=0;k

谢谢大家!

为什么在声明按钮时使用“final”修饰符?使用“final”时,对对象按钮的引用是一个常量,这意味着您不能在矫揉造作后更改其值。你能解释一下你的选择吗?Thanks@DanishAshfaq,我使用它是因为如果Eclipse不是
final
,它就不会编译。您不应该使用
setBounds()
,而应该使用
布局。然后布局会处理好的,嗯,布局,你不必担心它。阅读以了解布局以及如何使用它们。@DanishFaq OP不会更改按钮,而是在每次启动
侦听器时创建一个新的按钮<代码>最终版
与否在这里没有任何区别(除非它不是最终版时不会编译)。@Baz,你说得对!但也许更好的解决方案是更新正确定位的按钮上的文本,并隐藏/显示其他按钮?最好不要创建太多的对象,因为垃圾收集器工作良好,但并非完美无缺!