gpt4 book ai didi

java - 将数据从数据库加载到每个字段的 Jcheckboxes

转载 作者:行者123 更新时间:2023-11-29 05:51:58 26 4
gpt4 key购买 nike

我正在使用 JFreechart 库创建一个分析系统,我想拥有类似于 MS excel 中的数据透视表功能,我想汇集某个数据库字段,以便我有 Jcheckboxes 具有来自数据库。我已经使用 JCombobox 实现了这个:

Class.forName("oracle.jdbc.driver.OracleDriver");
dbcon = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "USERNAME", "PASSWORD");
Statement st = dbcon.createStatement();
String combo = "Select DORM_NAME from dormitory_master_table";
ResultSet res = st.executeQuery(combo);
Vector v = new Vector();
while (res.next()) {
String ids = res.getString("DORM_NAME");
v.add(ids);


cboDormitory = new JComboBox(v);

这会将所有宿舍名称放入 Jcombobox,但这对我想要执行的操作无效,因为我需要能够选择多个对象。我该如何实现?

最佳答案

澄清你想要多个JCheckBox s 在单个 JComboBox为了允许多项选择而不需要数百个 JCheckbox在屏幕上?

听起来像是 JList 的工作在这种情况下。

见:

A JList将允许从值列表中进行多项选择(截图直接来自 orcale - 如何使用列表教程来说明我的意思):

enter image description here

这是我的自定义示例,它使用 JCheckBox小号:

enter image description here

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class JListTest {

public JListTest() {
JFrame frame = new JFrame();
frame.setTitle("JList Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

initComponents(frame);

frame.pack();
frame.setVisible(true);
}

private void initComponents(JFrame frame) {
String[] strs = {"swing", "home", "basic", "metal"};

final JList checkBoxesJList = new JList(createData(strs));
checkBoxesJList.setCellRenderer(new CheckListRenderer());
checkBoxesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

checkBoxesJList.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int index = checkBoxesJList.locationToIndex(e.getPoint());
CheckableItem item = (CheckableItem) checkBoxesJList.getModel().getElementAt(index);
item.setSelected(!item.isSelected());
Rectangle rect = checkBoxesJList.getCellBounds(index, index);
checkBoxesJList.repaint(rect);
}
});

JScrollPane scrollPane = new JScrollPane(checkBoxesJList);
frame.add(scrollPane, BorderLayout.CENTER);
}

private CheckableItem[] createData(String[] strs) {
int n = strs.length;
CheckableItem[] items = new CheckableItem[n];
for (int i = 0; i < n; i++) {
items[i] = new CheckableItem(strs[i]);
}
return items;
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JListTest();
}
});
}
}

class CheckListRenderer extends JCheckBox implements ListCellRenderer {

public CheckListRenderer() {
setBackground(UIManager.getColor("List.textBackground"));
setForeground(UIManager.getColor("List.textForeground"));
}

@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean hasFocus) {
setEnabled(list.isEnabled());
setSelected(((CheckableItem) value).isSelected());
setFont(list.getFont());
setText(value.toString());
return this;
}
}

class CheckableItem {

private String str;
private boolean isSelected;

public CheckableItem(String str) {
this.str = str;
isSelected = false;
}

public void setSelected(boolean b) {
isSelected = b;
}

public boolean isSelected() {
return isSelected;
}

@Override
public String toString() {
return str;
}
}

更新

根据您的评论:

1) 替换:Vector v = new Vector();ArrayList<String> v=new ArrayList<>();

2) 现在编辑createData(..)类似于:

private CheckableItem[] createData(ArrayList<String> strs) {
int n = strs.size();
CheckableItem[] items = new CheckableItem[n];
for (int i = 0; i < n; i++) {
items[i] = new CheckableItem(strs.get(i));
}
return items;
}

3) 只需调用 createData引用ArrayList (我们称之为 v ):

createData(v);

关于java - 将数据从数据库加载到每个字段的 Jcheckboxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com