dirku
asked on
Unwanted ListSelectionEvent when using JComboBox
In my JApplet a JTable is contained as well as a JComboBox which is used to determine the content of the JTable.
At first no row in the JTable is selected and so some JMenuItems of a JMenu which also contained in the JApplet are disabled. These should become only enabled when a row in the JTable is selected.
When the JComboBox' is used its list drops down over a part of the JTable.
Whenever the JComboBox' list drops down and I choose an item a ListSelectionEvent is fired from the table's DefaultListSelectionModel.
So it seems that clicking on a JComboBox' item goes through this component and reaches a row from the JTable.
A selected row, however, is not displayed then, all rows appears unselected.
How can I prevent from this?
At first no row in the JTable is selected and so some JMenuItems of a JMenu which also contained in the JApplet are disabled. These should become only enabled when a row in the JTable is selected.
When the JComboBox' is used its list drops down over a part of the JTable.
Whenever the JComboBox' list drops down and I choose an item a ListSelectionEvent is fired from the table's DefaultListSelectionModel.
So it seems that clicking on a JComboBox' item goes through this component and reaches a row from the JTable.
A selected row, however, is not displayed then, all rows appears unselected.
How can I prevent from this?
ASKER
Edited text of question
What does the combo box have to do with the table? Why selecting an item from the combo box should have any bearing on the table model? It is not very clear.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
When using System.out.println(LSe.get Source()); (where LSe is a ListSelectionEvent) the event looks like this com.sun.java.swing.event.L istSelecti onEvent[ source=com.sun.java.swing. DefaultLis tSelection Model 1898706 ={} firstIndex= 0 lastIndex= -1 isAdjusting= false ].
Thus, if I don't set the adjusting to true from the choice in the JComboBox your suggstion will never work, won't it?
I never worked with the adjusting property so I don't know how to set.
What must I do to set adjusting true and where or when?
Thus, if I don't set the adjusting to true from the choice in the JComboBox your suggstion will never work, won't it?
I never worked with the adjusting property so I don't know how to set.
What must I do to set adjusting true and where or when?
ASKER
For msmolyak:
In the JComboBox all the portfolios of a user are listed.
When starting the JApplet all portfolio names will be added and all portfolio data will be displayed. However, if the portfolios contain a large number of entries a user might want to see only one of his, say ten, portfolios. Then he simply needs to make a choice in the JComboBox and only the values of the selected portfolio will be displayed.
This is the need for the JComboBox related to the JTable in this JApplet.
In the JComboBox all the portfolios of a user are listed.
When starting the JApplet all portfolio names will be added and all portfolio data will be displayed. However, if the portfolios contain a large number of entries a user might want to see only one of his, say ten, portfolios. Then he simply needs to make a choice in the JComboBox and only the values of the selected portfolio will be displayed.
This is the need for the JComboBox related to the JTable in this JApplet.
ASKER
I found a method in JTable called setValueIsAdjusting. Do I understand the explanation right that its function is like removing a listener object and after handling the event use the addXXXListener method?
ASKER
I tried out what you suggested but it doesn't take any effect. However, my problem seems to be nonexistent anymore (wether using setValueIsAdjusting or not).
Maybe you could answer me another questions that I can grade you? Hope this is OK?
In my JApplet I read some data from a database and I use a DefaultTableModel to store the values in a Vecotr of Vectors.
Here's the code which is used to store the data from the ResultSet into the Vecotrs:
try
{
if( queryResult == null)
{
System.err.println("Result Set geschlossen.");
return false;
}
ResultSetMetaData rsmd = queryResult.getMetaData();
int columns = rsmd.getColumnCount();
columnNames = new Vector(columns);
for(int i=0; i<columns; i++)
{
columnNames.addElement(rsm d.getColum nLabel(i+1 ));
System.out.println(columnN ames.eleme ntAt(i).to String());
}
rows = new Vector();
while( queryResult.next() )
{
Vector cols = new Vector(columns);
for(int i=1; i<=columns; i++)
{
int type = rsmd.getColumnType(i);
cols.addElement(readValue( queryResul t, type, i));
}
rows.addElement(cols);
}//end while( queryResult.next() )
protected final Object readValue(ResultSet queryResult, int type, int col)
{
Object value = null;
try
{
switch(type)
{
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
value = queryResult.getString(col) .trim();
break;
case Types.BIT:
Boolean bool = new Boolean(queryResult.getBoo lean(col)) ;
value = bool;
break;
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
Integer num = new Integer(queryResult.getStr ing(col));
value = num;
break;
case Types.BIGINT:
Long numL = new Long(queryResult.getString (col));
value = numL;
break;
case Types.REAL:
Float real = new Float(queryResult.getStrin g(col));
value = real;
break;
case Types.FLOAT:
case Types.DOUBLE:
Double dbl = new Double(queryResult.getStri ng(col));
value = dbl;
break;
case Types.NUMERIC:
case Types.DECIMAL:
BigDecimal bDec;
bDec = new BigDecimal(queryResult.get String(col ));
bDec.setScale(precision);
value = bDec;
break;
case Types.DATE:
value = queryResult.getDate(col);
break;
case Types.TIME:
value = queryResult.getTime(col);
break;
case Types.TIMESTAMP:
value = queryResult.getTimestamp(c ol);
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
value = queryResult.getBytes(col);
break;
default: value = queryResult.getObject(col) ;
}//end switch
return value;
}
catch(SQLException SQLe)
{
System.err.println("SQL-Fe hler: " + SQLe.toString());
return null;
}
}//end readValue
This works really well. As you can see I set the scale of the BigDecimals to 2 before storing them into the Vector.
The problem:
When reading BigDecimal values from the Vector they ever have a scale of 4! I don't understand this.
Furthermore I do some calculations with the values in the table and add some further columns to the table in which the calculated values are placed. The calculated values have a scale of 4, too, even although I set the scale explicitely to 2.
After calculating I store the values in the Vector so that they can be shown in the table, of course.
So, how can I accomplish that BigDecimals are shown in the table with a scale/precision of 2?
Maybe you could answer me another questions that I can grade you? Hope this is OK?
In my JApplet I read some data from a database and I use a DefaultTableModel to store the values in a Vecotr of Vectors.
Here's the code which is used to store the data from the ResultSet into the Vecotrs:
try
{
if( queryResult == null)
{
System.err.println("Result
return false;
}
ResultSetMetaData rsmd = queryResult.getMetaData();
int columns = rsmd.getColumnCount();
columnNames = new Vector(columns);
for(int i=0; i<columns; i++)
{
columnNames.addElement(rsm
System.out.println(columnN
}
rows = new Vector();
while( queryResult.next() )
{
Vector cols = new Vector(columns);
for(int i=1; i<=columns; i++)
{
int type = rsmd.getColumnType(i);
cols.addElement(readValue(
}
rows.addElement(cols);
}//end while( queryResult.next() )
protected final Object readValue(ResultSet queryResult, int type, int col)
{
Object value = null;
try
{
switch(type)
{
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGVARCHAR:
value = queryResult.getString(col)
break;
case Types.BIT:
Boolean bool = new Boolean(queryResult.getBoo
value = bool;
break;
case Types.TINYINT:
case Types.SMALLINT:
case Types.INTEGER:
Integer num = new Integer(queryResult.getStr
value = num;
break;
case Types.BIGINT:
Long numL = new Long(queryResult.getString
value = numL;
break;
case Types.REAL:
Float real = new Float(queryResult.getStrin
value = real;
break;
case Types.FLOAT:
case Types.DOUBLE:
Double dbl = new Double(queryResult.getStri
value = dbl;
break;
case Types.NUMERIC:
case Types.DECIMAL:
BigDecimal bDec;
bDec = new BigDecimal(queryResult.get
bDec.setScale(precision);
value = bDec;
break;
case Types.DATE:
value = queryResult.getDate(col);
break;
case Types.TIME:
value = queryResult.getTime(col);
break;
case Types.TIMESTAMP:
value = queryResult.getTimestamp(c
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
value = queryResult.getBytes(col);
break;
default: value = queryResult.getObject(col)
}//end switch
return value;
}
catch(SQLException SQLe)
{
System.err.println("SQL-Fe
return null;
}
}//end readValue
This works really well. As you can see I set the scale of the BigDecimals to 2 before storing them into the Vector.
The problem:
When reading BigDecimal values from the Vector they ever have a scale of 4! I don't understand this.
Furthermore I do some calculations with the values in the table and add some further columns to the table in which the calculated values are placed. The calculated values have a scale of 4, too, even although I set the scale explicitely to 2.
After calculating I store the values in the Vector so that they can be shown in the table, of course.
So, how can I accomplish that BigDecimals are shown in the table with a scale/precision of 2?
ASKER
Oops! The variable "precision" needs to be substituted with the value 2, of course. The int variable precision is set to 2 when I declare it in the class. besides there is a setPrecision(int val) in the class.
ASKER