自从我在这里发布以来已经有一段时间了,现在我发现自己又陷入了困境。
对于我在uni的工作,我们被要求创建一个地址簿应用程序。它进展顺利,它已接近完成,但是项目的一部分,纯粹是我的偏好,使我望而却步。我不是在任务的任何部分寻求帮助,这将获得我的印记,只是为了清楚。如果有人想要证据,我可以上传规范。 (/披露)
部分应用程序是从自定义文件类型和vcard格式导入和导出。这很好用。自定义文件类型包含多个联系人,每个联系人只有4行。因为它包含多个联系人,所以会打开一个新窗口,要求用户选择他们希望导出到该文件的联系人。这包含一个JList,用户可以在其中选择联系人并导出文件,没问题。
我一直在尝试做的是创建一个自定义单元格渲染器,它允许在JList中使用复选框。通过查看此处(http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer)和此处(http://www.jroller.com/santhosh/entry/jlist_with_checkboxes),我几乎得到了这个工作,但是没有运气。第一个链接说明了如何创建自定义单元格渲染器,但没有解释复选框,第二个链接说明了如何创建复选框。我可以显示复选框,然后显示所有内容。
在后一个示例中,必须单击框本身才能选择列表成员。我希望能够做的是允许用户点击列表项或复选框来选择项目。
在我工作的复选框的版本中,选择工作,但是仍然必须按住ctrl才能选择多个项目。有没有办法让它更多选择项目不需要ctrl?我知道您可以通过单击读取修改器,但不知道是否可以将它们应用于单击指定对象。
您的想法,意见,建议,链接和确切答案都非常欢迎! :)
答案 0 :(得分:1)
这样做,有点;虽然它基本上是伪造的,因为复选框并没有真正做任何事情,但检查它们确实选择了列表项。
import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
public class Relequestual extends JFrame {
private final FunkyCellRendererComponent funkyCRC = new FunkyCellRendererComponent();
public Relequestual() {
getContentPane().setLayout(new FlowLayout());
String[] items = { "Item 1", "Item 2", "Item 3", "Item 4" };
JList theList = new JList(items);
theList.setCellRenderer(
new ListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
funkyCRC.setup(list, value, index, isSelected, cellHasFocus);
return funkyCRC;
}
});
getContentPane().add(theList);
}
/**
* @param args
*/
public static void main(String[] args) {
Relequestual gui = new Relequestual();
gui.pack();
gui.setVisible(true);
}
class FunkyCellRendererComponent extends JPanel {
private JCheckBox checkBox = new JCheckBox();
private JLabel label = new JLabel();
private JList list;
private int index;
public FunkyCellRendererComponent() {
super(null);
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(this.checkBox);
add(this.label);
}
public void setup(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
this.list = list;
this.index = index;
this.label.setText((String) list.getModel().getElementAt(index));
if (isSelected) {
setForeground(list.getSelectionForeground());
setBackground(list.getSelectionBackground());
} else {
setForeground(list.getForeground());
setBackground(list.getBackground());
}
this.checkBox.setSelected(isSelected);
}
}
}
答案 1 :(得分:0)
我会使用JTable并将复选框添加为单独的列。
然后,您可以向表中添加MouseListener,每当选中其他列时,您都可以切换复选框的值。