i am creating simple inventry system in Java.when i add the productname,price,qty click add button product information should added into the JList.how it didn't added. got the Error.
java.lang.ClassCastException: javax.swing.JList$3 cannot be cast to javax.swing.DefaultListModel
DefaultListModel model;
String panme = (txtpname.getText());
int price = Integer.parseInt(txtprice.getText());
int qty = Integer.parseInt(txtqty.getText());
int tot = qty * price;
model = (DefaultListModel)jList1.getModel();
model.addElement(new Object[]
{
panme ,
price,
qty,
tot,
});
}
If you create a JList an empty constructor or using an Array or Vector, then a read only ListModel is created.
If you want to be able to modify the ListModel then you need to specifically add a DefaultListModel to the JList:
JList list = new JList( new DefaultListModel() );
Then in your above method you will be able to access the model as a DefaultListModel.
Having said that, you should NOT be using a JList for this since you are adding multiple properties. Instead you should use a JTable which allows you to add data that you can display in rows/columns.
Read the section from the Swing tutorial on How to Use Tables for more information.
Related
I have been trying to populate a Eclipse GUI Java JComboBox using an Array list using constructors without any luck. This is what I have tried thus far.
import item.Item;
import javax.swing.JComboBox;
import java.util.ArrayList;
public class SelectionScreen{
private JFrame frame;
static ArrayList< Item> list;
private String items;
public static void main (String[] args){
initialize();
}
public void initialize(){
list = new ArrayList< Item >();
list.add(new Item("Strawberry,200,.25,.75);
list.add(new Item("Banana,200,.25,1.00);
list.add(new Item("Oranges,200,.25,2.00);
JcomboBox comboBox = newJcomboBox();
ComboBox.setBounds(63,29,86,22)
frame.getContentPane().add(comboBox);
// here is where I tried to fill the combobox
//comboBox.setModel(new DefaultComboBoxModel(Item.getName()))); //Wrong
//comboBox.setModel(Item.getName); //Wrong
//the following only loads the last item in the list which is Oranges
for(Item i: list{
comboBox.setModel(new DefaultComboBoxModel(New String[] {
i.getName()}));
}
// tried making a different list to collect my fruits.
for(Item i: list){
list2[ i.getName()];
Item.length;
} //which was a complete fail.
I am at complete lost here and not very experienced with Java. I can load the items just fine using
comboBox.setModel(new DefaultComboBoxModel(new String[]{ "Strawberry","Banana","Oranges"}));
but I won't know what fruits are in the list when I import them from a text file.
Any help would be appreciated.
/*The following only loads the last item in the list which is Oranges.*/
for(Item i: list)
{
comboBox.setModel(new DefaultComboBoxModel(new String[] {
i.getName()}));
}
Don't keep creating a new ComboBoxModel inside the loop. You can't add more than one item to the model if you keep creating a new model. So you only see the last model created with the single item added to it. If you want to use this approach then you would create the model OUTSIDE of the loop and then just add items the model INSIDE the loop.
Actually you don't event need to create a combo box model. You can just add items directly to the combo box:
Something like:
for(Item i: list
{
comboBox.addItem( i.getName() );
}
Another option is to add the Item object directly to the combo box. Then you can use a custom renderer to control which property of the Item object is display in the combo box. Check out Combo Box With Custom Renderer for more information on this approach.
If you wish to show Item objects in a combobox then you should declare the JComboBox to store Item objects. That way you can easily add items without having to do any mucking around with models at all:
JComboBox<Item> itemsCombo = new JComboBox<>();
list.forEach(itemsCombo::add);
The value displayed in the combobox will be whatever is returned by Item.toString. If that's not what you want (because your toString returns a more complete description of the object - generally considered better practice) then it is fairly easy to write your own Custom Renderer.
The only hackish downside of the JComboBox API is that you've got to cast the selected item:
Item selectedItem = (Item)itemsCombo.getSelectedItem();
This is ugly and I wish the API didn't require it but it's a small price to pay to avoid having to define your own model.
You can, in fact, avoid the cast by:
Item selectedItem = itemsCombo.getItemAt(itemsCombo.getSelectedIndex());
But that's just about as ugly.
As an aside, this is one of several areas in which the standard Java tutorial and samples are quite out of date so there's no blame here at all for not knowing to use generics.
the task which I do is quite simple, but I faced one problem with JList component.
What i need is. I fetch data from DataBase, load it to String array, pack array into ArrayList (just because I duno how many records I have), return it from method as ArrayList.
Now at receiver side. I have a trouble, I cant fetch String array from ArrayList so that I can pass to JList.
Here is the code.
ArrayList<Object> fetch = new ArrayList<Object>();
public String[] data =new String[10];
listModel = new DefaultListModel();
myList = new JList(listModel);
//myList = new JList(data);
// So it works with simple array of strings.
fetch=DAO.loadPasswords();
//At this point it asks me to cast an object to smth which late cause null pointer exception.
myList = new JList(fetch.get(0));
And here is loadPasswords();
public static ArrayList<Object> loadPasswords(){
dbConnect();
boolean unswer = false;
String[] result=null;
String query1 = "select * from tblPasswordsStorage where "
+ "_user_id = ?";
String userId=Personal_Organizer.userProfile.getUserID();
ArrayList<Object> params = new ArrayList<Object>();
params.add(userId);
executeQueryP(query1, params);
ArrayList<Object> fetched=null;
try {
if (rs.next()) {
unswer = true;
//Personal_Organizer.userProfile.setUserID(rs.getString(1));
result[0]=rs.getString(1);
result[1]=rs.getString(2);
result[2]=rs.getString(3);
result[3]=rs.getString(4);
result[4]=rs.getString(5);
result[5]=rs.getString(6);
result[6]=rs.getString(7);
result[7]=rs.getString(8);
result[8]=rs.getString(9);
result[9]=rs.getString(10);
fetched.add(result);
}
if (unswer) {
while (rs.next()) {
Tools.print(rs.getString(1));
}
}
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null,
"SQL Server connection issue.\n"
+ "Please, check Server address, user name and password.",
"Output",
JOptionPane.PLAIN_MESSAGE);
}
dbClose();
return fetched;
}
I tried to use multidimensional array but still JList require single dimensional array.
Either use a DefaultListModel and load it with your Strings using a simple for or for-each loop that loops through your ArrayList, adding each String item in the ArrayList into the model, or create your own ListModel class, one that extends AbstractListModel and that uses the ArrayList as its data nucleus.
Edit, since your data is held in an ArrayList of arrays, then perhaps you don't want to display it within an ArrayList after all, but rather in a JTable. Here your best bet would be to create your own TableModel, one based off of AbstractTableModel and that uses your ArrayList as its data nucleus. Also, perhaps better than loading your data into an array would be to create a custom class to hold each row of data from the ResultSet.
You state:
My problem is to simply load something to JList. The idea is to display application/website name in the list, then when you click on it, you get full data which contains in array. That's why I put fetch.get(0)...because. I need at least something.
Then
Create a custom class to hold each row of data.
Create items of this class from each row of the ResultSet
Fill your DefaultListModel with items of this class
Give your JList a custom ListCellRenderer, one that display's the application/website name
Then you can display the name and still have each list item hold all the pertinent information that it needs.
Is there another way to remove all items of a JComboBox then removeAllItems()? I use 2 JComboBoxes in mij app and when you select an item from the first combobox the related items should then be shown in the second combobox. When I do this, the items just keep appending after the ones that were already there. When I then first try to clear the combobox by using removeAllItems(), the second combobox is empty and stays empty whenever I change the first combobox... The first combobox keeps all its values... Does anyone see my problem?
festival is the JComboBox:
private JComboBox festival;
private JComboBox zone;
...
public void fillFestivalList(){
festival.removeAllItems();
List festivals = OP.fillFestivalList();
for(Object fest: festivals)
festival.addItem(fest.toString());
}
public void fillZoneList(String festival){
zone.removeAllItems();
List zones = OP.fillZoneList(festival);
for(Object zoneItem: zones)
zone.addItem(zoneItem.toString());
}
Regarding,
Is there another way to remove all items of a JComboBox then removeAllItems()?
Simply give the JComboBox a new model.
I would create a new DefaultComboBoxModel<T>, fill it with the newest entries, and then call setModel(...) on my JComboBox, passing in the new model when desired.
You can also Remove all the items in this way ,
but better to Give JCombobox a new DefaultComboBoxModel like the way #Hovercraft Full Of Eels said
int itemCount = combo.getItemCount();
for(int i=0;i<itemCount;i++){
combo.removeItemAt(0);
}
Connection connection = newConnection.createConnection();
Statement newStat = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet res = newStat.executeQuery("SELECT contactName FROM Contact WHERE accountName='"+m+"'");
Vector<String> temp = new Vector<String>();
//res.first();
while (res.next()){
temp.add(res.getString("contactName"));
}
newStat.close();
connection.close();
customerContactList = new JList(temp);
repaint();
I have a Jlist with account names, when an account is selected, on the side there is a button which has to be pressed for in order to call the code above.
The code is supposed to get contact names associated to that account and populate them into
the JList. This does not happen. The Jlist stays blank, i debugged and the vector temp does get 3 values and stores them into the new jlist, the problem is, JList does not refresh.
How can I make it refresh?
Thanks a lot and I appreciate any help.
Kunal
The new JList you created hasn't been added to any container, so you'd have to add it to the frame, just as the original one was, and then call "validate()" on the frame (always necessary when you add/remove components to a visible window.) But it would be better to call setListData() on the existing JList -- it would update right away, with less flashing around.
You can use a ListModel to manipulate the data inside the JList. And definitely not create new JLists at any step.
You have your JList bounded to your JFrame. Now you can get the data inside it using
JList list = new JList();
ListModel model = list.getModel();
and modify that model, then send the new model back:
DefaultListModel listModel = new DefaultListModel();
while (res.next()) {
listModel.addElement( res.getString("contactName") );
}
list.setModel(listModel);
I have two JList on a swing GUI. Now I want that when a user clicks on a button (say TransferButton) the selected elements from one JList is added from the first JList to the second JList and remove those selected elements from the first JList.
The model doesn't know about selection.
The JList provides several methods to get the selected item or selected index. Use those methods to get the items and add them to the other list's model.
You have two JLists, then you also have their respective ListModels. Depending on how you implemented them you can just remove the elements from one model and add them to the other. Note, though, that the ListModel interface doesn't care for more than element access by default, so you probably have to implement add and remove methods there by yourself.
DefaultListModel leftModel = new DefaultListModel();
leftModel.addElement("Element 1");
leftModel.addElement("Element 2");
leftModel.addElement("Element 3");
leftModel.addElement("Element 5");
leftModel.addElement("Element 6");
leftModel.addElement("Element 7");
JList leftList = new JList(leftModel);
DefaultListModel rightModel = new DefaultListModel();
JList rightList = new JList(rightModel);
Let's imagine you have two JList components as described in the code above (left and right). You must write following code to transfer selected values from the left to the right JList.
for(Object selectedValue:leftList.getSelectedValuesList()){
rightModel.addElement(selectedValue);
leftModel.removeElement(selectedValue);
}