Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / February 2006

Tip: Looking for answers? Try searching our database.

JTable in JComboBox

Thread view: 
lizard - 27 Jan 2006 05:58 GMT
I am attempting to build a combobox that uses a table
instead of a list.  The user should be able to select
a row in the table.  As the mouse moves over the table,
the row should be highlighted.  

I am looking at the source code for the combobox and
it is overwhelming.  Does someone know if something
like the above has been implemented?  If not, any suggest
as how I go about implement such combobox?

Thanks.
Bart Cremers - 27 Jan 2006 07:38 GMT
You should not look at re-implementing JComboBox but simply implement a
custom ListCellRenderer. Instead of the default JLabel used by the
DefaultListCellRenderer create on that extends JTable and work on that
one.

Bart
zero - 27 Jan 2006 19:00 GMT
> I am attempting to build a combobox that uses a table
> instead of a list.  The user should be able to select
[quoted text clipped - 7 lines]
>
> Thanks.

Bart's suggestion (a ListCellRenderer that extends JTable) is indeed the
way to go.  I just wanted to ask, when you get it to work, would you mind
posting the code here or on a website somewhere?  Sounds like something
that could potentially be useful to others as well.
Bart Cremers - 30 Jan 2006 07:27 GMT
Here's a working example, not perfect, but could be used as starters.

import java.awt.Component;
import java.awt.FlowLayout;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;

/**
* @author Bart Cremers
*/
public class TableCombo extends JFrame {

   protected void frameInit() {
       super.frameInit();

       setLayout(new FlowLayout());

       JComboBox box = new JComboBox(new Row[] {
           new Row("Row 1", "Row 1 value", "Row 1 Extra"),
           new Row("Row 2", "Row 2 value", "Row 2 Extra"),
           new Row("Row 3", "Row 3 value", "Row 3 Extra"),
           new Row("Row 4", "Row 4 value", "Row 4 Extra"),
           new Row("Row 5", "Row 5 value", "Row 5 Extra"),
           new Row("Row 6", "Row 6 value", "Row 6 Extra"),
           new Row("Row 7", "Row 7 value", "Row 7 Extra"),
           new Row("Row 8", "Row 8 value", "Row 8 Extra"),
           new Row("Row 9", "Row 9 value", "Row 9 Extra"),
       });

       box.setRenderer(new RowCellRenderer());

       add(box);
   }

   public static void main(String[] args) {
       JFrame f = new TableCombo();
       f.pack();
       f.setLocationRelativeTo(null);
       f.setDefaultCloseOperation(EXIT_ON_CLOSE);
       f.setVisible(true);
   }

   private static class Row {

       private String id, val, extra;

       public Row(String id, String val, String extra) {
           this.id = id;
           this.val = val;
           this.extra = extra;
       }

       public String getId() {
           return id;
       }

       public String getVal() {
           return val;
       }

       public String getExtra() {
           return extra;
       }
   }

   private static class RowCellRenderer extends JTable implements
ListCellRenderer {

       public RowCellRenderer() {

setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
       }

       public Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected,
                                                     boolean
cellHasFocus) {
           setModel(new RowTableModel((Row) value));
           if (isSelected) {
               getSelectionModel().setSelectionInterval(0, 0);
           }
           return this;
       }
   }

   private static class RowTableModel extends AbstractTableModel {

       private Row row;

       public RowTableModel(Row row) {
           this.row = row;
       }

       public int getRowCount() {
           return 1;
       }

       public int getColumnCount() {
           return 3;
       }

       public Object getValueAt(int rowIndex, int columnIndex) {
           switch(columnIndex) {
               case 0:
                   return row.getId();
               case 1:
                   return row.getVal();
               case 2:
                   return row.getExtra();
           }
           return null;
       }
   }
}

Bart
zero - 30 Jan 2006 18:48 GMT
"Bart Cremers" <bcremers@gmail.com> wrote in news:1138606078.948149.194740
@g14g2000cwa.googlegroups.com:

> Here's a working example, not perfect, but could be used as starters.

<code snipped>

> Bart

Looks nice, thanks :-)
lizard - 30 Jan 2006 20:28 GMT
> Here's a working example, not perfect, but could be used as starters.

Thanks.  :)

Assume that I have a large number of columns (20+) and that the
first column contains the ID of each rows.  Can I display the
ID in the field above the dropped down table rather than the
entire row?

And what if I rather than constructs a table for each list item,
can I simply use a single table instead of a list of tables? This
is because it would be nice to have the headers.
Bart Cremers - 01 Feb 2006 07:12 GMT
Displaying only the ID in the field is just a matter of working on the
renderers.

The reason I use one table per row is that the cellrenderers in a List
require one single renderer per row. Implementing something like you
said is best achieved through your own component I think.

[textfield][button]
[window with JTable               ]

Is not that hard to implement.

Regards,

Bart


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.