我已经有一段时间没有使用 Java Swing 进行编程了,所以我并不是它所有方法的专家。为了将我正在做的事情结合起来,我正在构建一个在 UR Cobot 中使用的 URCap UI(这基本上是一个 UI,允许我控制安装在机器人上的东西,例如夹具),为此UI 我必须创建大约 64 个复选框供用户选择,他可以同时检查一个或多个。因此,根据 StackOverflow 的教程和其他问题,我首先创建了一个复选框列表
private List<JCheckBox> checkBoxList = new ArrayList<JCheckBox>();
我将此列表的每个元素添加到 JPanel,然后将该面板添加到 JScrollPane,如下所示:
for (JCheckBox checkBox: checkBoxList) {
panel.add(checkBox);
}
scrollPane.add(panel);
这是我在不知疲倦地寻求帮助和测试我发现的代码之后可以获得的进一步成果,根据提供它们的人的说法,这种逻辑应该(我认为)正常工作,但就我而言,当我构建它时, ScrollPane 显示在 GUI 中,但没有复选框,请参见下图:
我不确定是什么导致了这个问题,我不知道我是否应该使用这样的复选框列表,只需将其定义为列表,但我尝试了很多不同的方法,使用 JList、数组JCheckBox[] 和其他人,但他们给了我同样的问题。
我知道除了这个错误之外,我的代码正在工作,因为我使用单个 JCheckBox 测试了scrollPane(请参阅函数 createJobsPanel1())并且它成功呈现了复选框:
这是我的完整代码,为了简单地向您解释它,您只需关注函数
createJobsPanelx()
、setIOCheckBoxItems()
以及我定义 JCheckBox 列表的全局变量。函数 BuildUI()
仅调用其他函数来构建 UI。
另外, setIOCheckBoxItems()
被放置在另一个类中的另一个函数调用,但只是为了解释它的作用,它将 JCheckBox 列表元素设置为“1, 2, 3, 4, 5 ...”等等.
package com.sigmaclermont.ploc2dMultObjDetect.impl;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JCheckBox;
import javax.swing.JScrollPane;
import javax.swing.plaf.metal.MetalCheckBoxIcon;
import com.ur.urcap.api.contribution.ContributionProvider;
import com.ur.urcap.api.contribution.ViewAPIProvider;
import com.ur.urcap.api.contribution.program.swing.SwingProgramNodeView;
public class Ploc2dProgramNodeView implements SwingProgramNodeView<Ploc2dProgramNodeContribution>{
private final ViewAPIProvider apiProvider;
public Ploc2dProgramNodeView(ViewAPIProvider apiProvider) {
this.apiProvider = apiProvider;
}
//private JCheckBox[] checkBoxList = new JCheckBox[64];
//private JCheckBox checkBoxOrig = new JCheckBox();
private List<JCheckBox> checkBoxList = new ArrayList<JCheckBox>();
@Override
public void buildUI(JPanel panel, ContributionProvider<Ploc2dProgramNodeContribution> provider) {
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(createDescription("Select the active Jobs:"));
panel.add(createJobsPanel2(checkBoxList));
}
/*public void setIOCheckBoxItem1(Integer item) {
checkBoxOrig.setText(Integer.toString(item));
checkBoxOrig.setIcon(new MetalCheckBoxIcon() {
protected int getControlSize() {return 30;}
});
checkBoxOrig.setFont(new java.awt.Font("Arial", Font.LAYOUT_LEFT_TO_RIGHT, 20));
}*/
public void setIOCheckBoxItem2(Integer[] items) {
for (Integer item: items) {
checkBoxList.add(new JCheckBox(Integer.toString(item+1)));
}
}
private Box createDescription(String desc) {
Box box = Box.createHorizontalBox();
box.setAlignmentX(Component.LEFT_ALIGNMENT);
JLabel label = new JLabel(desc);
box.add(label);
return box;
}
/*private Box createJobsPanel1(final JCheckBox checkBox) {
Box box = Box.createHorizontalBox();
box.setAlignmentX(Component.LEFT_ALIGNMENT);
JPanel panel = new JPanel();
panel.add(checkBox);
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setPreferredSize(new Dimension(100,100));
scrollPane.setMaximumSize(scrollPane.getPreferredSize());
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
});
box.add(scrollPane);
return box;
}*/
private Box createJobsPanel2(final List<JCheckBox> checkBoxList) {
Box box = Box.createHorizontalBox();
box.setAlignmentX(Component.LEFT_ALIGNMENT);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setPreferredSize(new Dimension(300,300));
scrollPane.setMaximumSize(scrollPane.getPreferredSize());
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(250,250));
panel.setMaximumSize(panel.getPreferredSize());
panel.setLayout(new GridLayout(8,1));
for (JCheckBox checkBox: checkBoxList) {
panel.add(checkBox);
}
scrollPane.add(panel);
for (JCheckBox checkBox: checkBoxList) {
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
});
}
box.add(scrollPane);
return box;
}
}
我尝试了所有类型的解决方案,但没有一个有效。 我期望 ScrollPane 包含 64 个复选框,其中文本从“1”到“64”,用户可以在其中选择一个或多个。
编辑: 这是包含 openView() 方法的后端代码,它从其他代码调用 setIOCheckBoxItems() 并传递从 1 到 64 的整数数组
package com.sigmaclermont.ploc2dMultObjDetect.impl;
import com.ur.urcap.api.contribution.ProgramNodeContribution;
import com.ur.urcap.api.contribution.program.ProgramAPIProvider;
import com.ur.urcap.api.domain.data.DataModel;
import com.ur.urcap.api.domain.script.ScriptWriter;
import com.ur.urcap.api.domain.undoredo.UndoRedoManager;
import com.ur.urcap.api.domain.undoredo.UndoableChanges;
public class Ploc2dProgramNodeContribution implements ProgramNodeContribution{
private final ProgramAPIProvider apiProvider;
private final Ploc2dProgramNodeView view;
private final DataModel model;
private final UndoRedoManager undoRedoManager;
public Ploc2dProgramNodeContribution(ProgramAPIProvider apiProvider, Ploc2dProgramNodeView view,
DataModel model) {
this.apiProvider = apiProvider;
this.view = view;
this.model = model;
this.undoRedoManager = this.apiProvider.getProgramAPI().getUndoRedoManager();
}
private Integer[] getOutputItems() {
Integer[] items = new Integer[64];
for(int i = 0; i<64; i++) {
items[i] = i;
}
return items;
}
@Override
public void openView() {
view.setIOCheckBoxItems(getOutputItems());
}
@Override
public void closeView() {
// TODO Auto-generated method stub
}
@Override
public String getTitle() {
return "Ploc2D MultiObj";
}
@Override
public boolean isDefined() {
// TODO Auto-generated method stub
return false;
}
@Override
public void generateScript(ScriptWriter writer) {
// TODO Auto-generated method stub
}
}