繁体   English   中英

JComboBox-超出范围的异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM