[英]JComboBox - out of bounds exception
我有一个小问题。 我正在尝试将数据库中的登录名导入向量,然后将该向量用于JComboBox。 我下载登录信息的方法:
public void loginReader (Vector<String> loginy, String tableName)
{
String query = "select login from " + tableName;
try {
Statement statement = mConnection.createStatement();
ResultSet rs = statement.executeQuery(query);
while (rs.next())
{
Vector<String> vstring = new Vector<String>();
vstring.add(rs.getString("login"));
loginy.addAll(vstring);
}
} catch (SQLException e)
{
e.printStackTrace();
}
}
在DatabaseManagement类中。 我制作了另一个类(GUI),并且有JComboBox。 为什么不起作用?
package DataBase_Hospital;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Properties;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Message extends JFrame implements ActionListener {
JButton SEND_MESSAGE;
JButton READ_MESSAGE;
public JLabel background;
JLabel NAME_LABEL;
JTextField NAME_FIELD;
JTextArea DATABASE_FIELD;
static Vector<String> loginy = new Vector<String>();
private static DatabaseManagement DATABASE;
public Message() {
setSize(290, 500);
setTitle("Message Panel");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
JLabel background=new JLabel(new ImageIcon("/Users/Dominik/Desktop/messageFrame.png"));
add(background);
DATABASE_FIELD = new JTextArea(3,3);
JScrollPane scrollPane = new JScrollPane(DATABASE_FIELD);
scrollPane.setBounds(45, 50, 200, 200);
background.add(scrollPane);
DATABASE_FIELD.setEditable(true);
NAME_LABEL = new JLabel("Odbiorca :");
NAME_LABEL.setBounds(40, 380, 140, 20);
background.add(NAME_LABEL);
SEND_MESSAGE = new JButton();
SEND_MESSAGE.setIcon(new ImageIcon("/Users/Dominik/Desktop/sendMail.jpg"));
SEND_MESSAGE.setBounds(75, 270, 60, 60);
background.add(SEND_MESSAGE);
SEND_MESSAGE.addActionListener(this);
SEND_MESSAGE.setToolTipText("Send message");
READ_MESSAGE = new JButton();
READ_MESSAGE.setIcon(new ImageIcon("/Users/Dominik/Desktop/jwj.png"));
READ_MESSAGE.setBounds(150, 270, 60, 60);
background.add(READ_MESSAGE);
READ_MESSAGE.addActionListener(this);
READ_MESSAGE.setToolTipText("Read message");
JComboBox loginList = new JComboBox(loginy);
loginList.setSelectedIndex(loginy.capacity());
loginList.addActionListener(this);
loginList.setBounds(145, 380, 100, 20);
background.add(loginList);
}
public static void main(String[] args) {
Message window = new Message();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
DATABASE.loginReader(loginy,"uzytkownicy");
}
public void actionPerformed(ActionEvent e)
{
Object EVENT_SOURCE = e.getSource();
DATABASE = new DatabaseManagement("pacjent");
if (EVENT_SOURCE == SEND_MESSAGE)
{
DATABASE.sendMessage(DATABASE_FIELD.getText(), "uzytkownicy", NAME_FIELD.getText()) ;
}
}
}
用空的Vector
创建JComboBox
之后,将selectedIndex
设置为loginy.capacity ()
。 问题是,尽管Vector
的容量为10(如JavaDoc中默认构造函数所述 ),但其实际大小为0。因此, ArrayOutOfBoundsException
。 在设置JComboBox
的选定索引之前,应检查Vector
的大小。
我怀疑问题是您正在尝试将组合框的选定索引设置为向量的容量。
loginList.setSelectedIndex(loginy.capacity());
从文档.capacity()
:
返回此向量的当前容量。 返回:当前容量(其内部数据数组的长度,保留在此向量的elementData字段中)
这不是大小,即数据库中的登录数量。 这就是内部数据结构的容量,该容量将始终> =向量中的元素数。
尝试使用Vector#size()
但是您仍然需要从中减去一个(假设向量中确实有数据),因此您的代码应为:
loginList.setSelectedIndex(loginy.size() - 1);
这将在comboBox中设置最后的登录名。 在您的情况下,这不是必需的,因为在创建组合框之后填充了向量,因此您可以从代码中删除此行,直到填充向量。
根据评论编辑
要使登录名所需要做的就是重新排列执行顺序。 即填充您的向量,然后创建您的组合框,将您的主要方法更改为如下所示:
public static void main(String[] args) {
//First initialise your database (dont do this in the action performed method)
// you should only need one and not need to create a new one on each action
DATABASE = new DatabaseManagement("pacjent");
// Read logins (I assume this is the method that does it)
DATABASE.loginReader(loginy,"uzytkownicy");
// Then create your message window...
Message window = new Message();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.