JTable scrolling problem...

I am having a problem with my JTable scrolling to show the newest added row. I have it working, but it jumps. Here is my problem.
I have the enter key acting like the tab key. I can force the scroll to the active cell but it jumps to row 0 for just a split second.
I know the problem is the way that I handle the Enter key. When I press enter I drop a cell down but then I force it back up.
Does any one know how to fix this? Here is some of the code that I am using...
if (event.getKeyChar() == '\n')
int r = tblDetailEntry.getSelectedRow();
int c = tblDetailEntry.getSelectedColumn();
if(r == 0)
r = curBill.billDetail.size();
c--;
if(r <= curBill.billDetail.size())
r--;
if(c == curBill.CODE)
c = 0;
if(r == curBill.billDetail.size() - 1)
detailEntry.addLine();     
r = curBill.billDetail.size() - 1;               
else
r++;
Rectangle rect = tblDetailEntry.getCellRect(r, 0, true);
tblDetailEntry.scrollRectToVisible(rect);
tblDetailEntry.editCellAt(r,c + 1);
tblDetailEntry.setRowSelectionInterval(r,r);
tblDetailEntry.setColumnSelectionInterval(c + 1,c + 1);     
}

My app is a bit more complex. It includes search criteria (Textboxes) and a
submit button which will write a dynamic SQL statment, execute and fill a table > thin an internal scrollpaneIt doesn't matter that you are using a "dynamic SQL statement". Whats important is how you build your TableModel and the TableModel you are using. I gave you an example that will use the DefaultTableModel and will work for a single row or 1,000 rows in the ResultSet.
Your question didn't state whether you are using the the DefaultTableModel or a custom TableModel. If you are using a custom TableModel, then chances are you have an error in you TableModel.
In no way am I asking for you or anyone else to supply me with code. Only a
possible step in the right direction. This is exactly what my example did. It proved to you that it works. So you look at your code and see what the differences are between one that works and one that doesn't. The example has three basic lines of code to build a scrollable table:
JTable table = new JTable(data, columnNames);
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
I don't know how is can get any simpler than that, so I would have no idea what to suggest you are doing wrong. Are you mixing AWT and Swing components?

Similar Messages

  • JTable Scrolling

    Hi,
    I have a problem in JTable scrolling of large data,I am getting a large data set from database, but I do not want to display all of the data at once (mainly because of OutOfMemory error).I want to display data in pages (say 50 records in each page) ,but I want to keep the vertical scrollbar position as though I have the entire data (Let's say 10,000 records) in JTable,But physically only 50 records are there in JTable. In another words,I want to give user an illusion of having 10,000 records, but in fact only 50 records are there at a time.It means if my scrollbar position is halfway,my jtable has displayed 5000 records.
    I will appreciate your help.
    Please email me directly at [email protected] or post your reply.
    Thanks

    hi Chuanhao,
    The reason I can't get the data directly from my table model using getValueAt is that,
    1) The data which I am getting from database is raw data, I have to do lot of processing,and format it in a certain way so that my JTable implementaion can understand it (My implementation of JTable takes the data as JTextArea and JButton,moreover, I have to convert the data into user readable format before I can send it to JTable for display)
    2) I want to do some caching of data, for example if user has scrolled down, and then again he wants to go back by scrolling up, I don't want to get the data from database,I would like to use the same data which is in cache,Or I want to keep several pages of data ready in another thread, so that when user scrolled down, he doesn't have to wait for database fetch.
    I don't think I can do all this thing if I get the data directly from table model using getValueAt.
    What I want to do at this point is find some way to override the scrolling behaviour of JTable,My problem here is this,When user scrolled down to 51st record, I am fetching another 50 records(or already cached page) and wants to display it in the table afresh,But as soon as I do it, scrollbar goes back to its starting position,but I want it to stay where it was,in this way I will have place to scroll up,and user will think that he has entire set of records at his disposal.
    Let me know what you think, any help will be greatly appreciated.
    Thanks

  • Still the same issue: Scrolling problem in itunes w/ dual screen setup

    Hey there,
    I am getting really ****** here. For 2 months this problem has been bugging me. It seems to randomly appear and disappear.
    Just have a look what is happening here: http://www.youtube.com/watch?v=N2m4G6c2Tqo
    I basically tried everything.
    1.Reinstalled Windows from scratch twice!
    2 Reinstalled Itunes a couple of times - clean install - tried different versions. Yea, got the latest one now.
    3. Tried different VGA drivers. Got the latest Intel driver installed.
    The problem has been gone for a couple of weeks now ever since I uninstalled a Windows update called U2711 Dell Display driver (The U2711 is my current LCD). That was just a 80KB file that messed Itunes up.
    Well, I believed I found the problem (hail system restore) but nope. Today it started happening again. I even have Windows Update deactivated for that reason so no changes have been made to the system in the last couple of days! It worked fine yesterday.
    So again: Same scrolling problem. And it only happens on my second large 27" screen. On the notebook screen it works just fine.
    Guys, I really need help. I'm about to curse Apple and Microsoft at the same time.
    Cheers
    K

    Since I am that furstated I started trying really unorthodox methods to resolve the problem.
    I just started Itunes in compatibilty mode (Windows XP SP3) and for now it seems to be working without that annoying bug!
    Anybody know what that means?!

  • Does anyone has the same scrolling problem? My macbook air 13''(2010) running lion, when files in a folder arranged by kind, every scrolling paused for a second..?

    does anyone has the same scrolling problem? My macbook air 13''(2010) running lion, when files in a folder arranged by kind, every scrolling paused for a second..?

    does anyone has the same scrolling problem? My macbook air 13''(2010) running lion, when files in a folder arranged by kind, every scrolling paused for a second..?

  • Persistent Scrolling Problem

    I have a two-finger scrolling problem with my 5- day- old Macbook (10.5, Firefox latest version). It was suggested in this forum that I turn off Horizontal scrolling. I did that, in fact I think I tried every combination of settings on the
    Keyboard & Mouse page, but the scrolling is still erratic. It jumps and stalls and
    then (occasionally) works. This happens on line or in documents. I wish I could determine if this is a software or a hardware problem. If it is hardware I need to return this unit real quick. I've been everywhere on the net looking for a software fix or update, but all I have found are add ons that will probably lead to more problems. I don't want to go through the aggravation of a return if I can help it.
    I'd appreciate any suggestions. Thanks Bill
    Now the cursor is acting funny! I can't fix these lines above.

    ok, dude, dont treat my reply as answer, but im just suggesting..why dun u plug in a normal mouse for gaming anyway?
    1)clicking a lot kills the batteries, and also wear out the clicking mechanism.
    2)the scrolling is too sensitive on windows (my exp.) and it switches the weapon unexpectedly all the time (left 4 dead 2)
    3)as u said, its windows! mac hates PC, just think about it, they intentionally hold up the start up time for windows on boot camp, so what quality do u expect with all the mac hardware on WINDOWS??
    I personally plug in a different set of keyboard and mouse to play games on bootcamp, cos the keys are still confusing for me, and USB HIDs dont need batteries, be green!

  • T43 Vertical Scrolling Problem (not just Firefox)- Any official response from Lenovo

    After searching the forum, i have not been able to find any response from Lenovo as to how to correct this problem.
    Incidentally, my "occasional" vertical scrolling problem occurs in any browser,  IE7, Firefox3, Opera9 (at least those 3) as well as Windows applications with a vertical scroll bar like Windows Explorer.
    This only started to occur very randomly around 6 months ago.  But as of late it is occuring more often.
    The only work-around
    http://blog.jonschneider.com/2008/03/workaround-th​inkpad-gets-into-always.html 
    might indicate that it is a possible hardware problem.
    However, I have to say that I rarely use the laptop scrolling buttons and 99.9% of the time, latetly, I use a Logitech laser USB mouse for scrolling purposes. 
    As another possible work-around (if you are using an external mouse) is to uncheck the enable virtual scrolling in the touchpad properties window. 
    I certainly hope it is not a hardware problem, as the warranty on my T43 ran out a long time ago.
    btw, I am running Windows XP Pro XP3.
    Moderator Note; added system type to subject
    Message Edited by andyP on 07-27-2009 09:32 PM

    Reset the page zoom on pages that cause problems: <b>View > Zoom > Reset</b> (Ctrl+0 (zero); Cmd+0 on Mac)
    See [[Text Zoom]] and [[Page Zoom]] and http://kb.mozillazine.org/Zoom_text_of_web_pages

  • How do you fix a scrolling problem on Apple TV?

    When I click the remote once, it scrolls to end of row or column.  I've restarted via remote, unplugged (restarted), restored to factory default = still have scrolling problem.  Tried 2 different remotes, same problem with each.  Tried unparring then reparring = no joy.

    Update your Adobe Flash player: Adobe Flash Player 16.0.0.305.

  • Vertical Scrolling problem in Safari

    I'm currently having an odd vertical scrolling problem in Safari.  This issue is not reproduced in Chrome or Firefox.
    I've been able to reproduce this issue doing something very simple:
    I have a browser wide rectangle with a solid color.
    Beneath that I have a browser wide photo.  (Rectangle set to browser edges and then fit to fill with photo.)
    And beneath that I have another browser wide rectangle with a solid color.
    Then I scroll.
    Once the photo (the middle element) reaches the top of the screen I have shut the scrolling off so the photo will stay static. (Initial motion 1 / Final motion 0 set in the "Fill/Scroll" tab - and the key position is set so it stops at the top of the browser.)  As expected, the lowest box continues to scroll upwards and cover the static photo.
    This very simple effect is flawless in Preview mode, Chrome, and Firefox.
    Yet in Safari, the photo, once it reaches its resting spot, does stay static, but seems to jump and jitter all over the place while I continue scrolling and the below content covers it.  (In the other browsers it's super solid like a real static background.)
    I've read there are some parallax scrolling bugs in Safari Mavericks.  But I'm still in an older operating system using 10.8.5 and Safari 6.0.5.
    Any suggestions or work arounds on how to correct this? (Again, I'm controlling the scroll using the scroll tab found with "Fill". Should I also be using the one found under Scroll Effects?  What the best one to use? Although it does work in the other browsers… so…  maybe I'm not doing anything wrong and this really is a Safari problem.)
    Thanks you.

    Hi
    Please share the site url, I will have a look.
    Thanks,
    Sanjit

  • Mouse scrolling problem

    My iMac is around two years old, and I'm on my third mouse. Why? Because of the scrolling ball. The present mouse scrolls in all directions except down. But previous mouses have stopped scrolling in more than one direction. I have read articles (including the stuff from Apple Support), and I have, I think, tried just about everything (except take it apart, as one article instructed). The mice work fine for a while--then come the scrolling problems. I've tried rubbing the ball (mouse upside down) vigorously on a lint-free cloth, and I regularly (when problems inevitably arise) clean the ball with alcohol and a Q-tip. The latter does get the ball pretty clean, and it works for a while; but eventually even this doesn't correct the scrolling problem (as is the case right now). So, unless someone can give me a suggestion that might work (with Mighty Mouse), can anyone recommend a non-Apple mouse--something not too expensive but of good quality?
    Thank you,
    Carl Kalwaitis

    Hi Carl, I used mice (Mighty included) but always went back to the trackball. You don't move your wrist and it is very precise. I have had the same trackball for three years and my Mighty Mouse (which came with my new iMac) is still in it's original packaging. I have a Logitech Marble Mouse. It has all the scrolling and other functions that the MM has. Give it a try and save yourself some exasperation.
    M.

  • HT6162 IOS 7.1 creates scrolling problem?

    Upgraded my UK iPhone 5S 64GB to ios 7.1 yesterday. I have been facing page scrolling problems in all applications (Bloomberg, BBC, Safari, FT, LinkedIn, FaceBook...all applications). The problem is easily reproduced by keeping your finger on the screen when the page to scroll is displayed and moving the finger slowly to scroll the page. The page jumps in direction opposite to the expected.

    Hey, I have an iPhone 5 64Gb just updated to iOS 7.1 (11D167) . Various apps all have the same scroll problem. It's amost like 1.5 cm from the the bottom of my screen, an invisable line across the phone where swiping across up or down causes the the normal smooth motion to be jumpy. This has only just happened after the latest iOS update. I have also noticed touch senstivity issues when using the keyboard in some older apps causing key strokes to be missed or even double pressed when only pressing once, and number keys to not work also. My current work around is to type the txt or numbers into notes app, then cut or copy the txt or numbers into the app i'm  using. My other work around for the scroll issue, is to use asistive touch and create a scroll gesture.
    Hope there is a fix for this soon. I'm not totally convinced this is a hardware issue. it's too coincidental these issues just happend to occur after the latest update. Gone through the normal power cycle, soft reboot holding home button and power button for 10 secs, but makes no difference.
    I've turned back on the' automatically send' diagnostics & usage setting in general settings hoping this will contribute to a fix.

  • HT201380 keep having scrolling problems with Maverick on both iMac and Mac Pro despite downloading mail software update

    Have scrolling problems with Maverick despite downloading mail update on both IMAC and Mac Pro
    Have to reboot and it helps for awhile then stalls again

    The Mac OS X 10.4.7 Update introduced connection issues as a result of (according to the documentation) "Mail now supports connecting to mail servers through a SOCKS proxy". This probably has nothing to do with your problem, but it'd be worth going to System Preferences > Network and making sure the SOCKS Proxy is not enabled in the network configuration used to connect to the Internet.
    Also, it looks like the crashes you're talking about are actually freezes, i.e. Mail becomes unresponsive rather than quitting unexpectedly. In Mail, open Window > Activity Viewer, and see whether Mail displays there what it's doing when it freezes. Actually, you may be able to avoid having to force quit Mail by canceling whatever it's doing (by clicking on the red stop icon of the activity).
    Reinstalling Mail will probably accomplish nothing, but it might be worth reinstalling the Combo Update for the type of machine and the version of Mac OS X you're using (which you would have to do anyway if you wanted to reinstall Mail):
    Mac OS X 10.4.7 Combo Update for Intel
    Take a look at the following articles for guidelines on how to properly install system updates:
    Troubleshooting installation and software updates
    Installing software updates
    Basically, you should verify/repair the startup disk before installing the update, and no applications should be running while installing it.

  • Scrolling problem with adobe digital edition

    scrolling problem comes when i am scrolling the book i have installed this in win-7 with x64 bit. the page was stucked in the initial opening page and the page no shoing below are changing when m scrolling. pls help;.

    This is the Reader forum; you should ask in the Digital Editions one,
    http://forums.adobe.com/community/adobe_digital_editions

  • JTable sorting - problem when adding elements (complete code inside)

    I�m writing this email with reference to a recent posting here but this time with the code example. (I apologize for the duplicated posting � this time it will be with the code)
    Problem: when adding more elements to the JTable (sorted) the exception: ArrayIndexOutOfBoundsException is thrown.
    Example: If the elements in the table are 10 and then the user requests for 8 � the table will produce the correct result. However, if the user will ask for 11 items (>10) the exception will be thrown.
    The program: The program below (compiles and running). A JTable is constructed with 3 items, when you click the button - the return result should be 4 items - this will generate the error, WHY?
    I would highly appreciate your thoughts why this is happening and most importantly � how to fix it.
    Thanks a lot
    3 files:
    (1) TableSorterDemo
    (2) Traveler
    (3)TableSorter
    //TableSorterDemo:
    package sorter;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    * TableSorterDemo is like TableDemo, except that it
    * inserts a custom model -- a sorter -- between the table
    * and its data model.  It also has column tool tips.
    public class TableSorterDemo implements ActionListener
         private JPanel superPanel;
         private JButton clickMe = new JButton("click me to get diff data");
         private boolean DEBUG = false;
         private DefaultListModel defaultListModel;
         private JTable table;
        public TableSorterDemo()
             superPanel = new JPanel(new BorderLayout());
             defaultListModel = new DefaultListModel();
             init1();
            TableSorter sorter = new TableSorter(new MyTableModel(defaultListModel)); //ADDED THIS     
            table = new JTable(sorter);             //NEW
            sorter.setTableHeader(table.getTableHeader()); //ADDED THIS
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));
            //Set up tool tips for column headers.
            table.getTableHeader().setToolTipText(
                    "Click to specify sorting; Control-Click to specify secondary sorting");
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
            //Add the scroll pane to this panel.
            superPanel.add("Center", scrollPane);
            superPanel.add("South",clickMe);
            clickMe.addActionListener(this);              
        public JPanel getPanel()
             return superPanel;
        public void init1()
             //in real life this will be done from the db
             Traveler a = new Traveler();
             Traveler b = new Traveler();
             Traveler c = new Traveler();
             a.setFirstName("Elvis");
             a.setLastName("Presley");
             a.setSprot("Ping Pong");
             a.setNumYears(3);
             a.setVegetarian(true);
             b.setFirstName("Elton");
             b.setLastName("John");
             b.setSprot("Soccer");
             b.setNumYears(2);
             b.setVegetarian(true);
             c.setFirstName("shaquille");
             c.setLastName("oneil");
             c.setSprot("Golf");
             c.setNumYears(22);
             c.setVegetarian(true);
             defaultListModel.addElement(a);
             defaultListModel.addElement(b);
             defaultListModel.addElement(c);
        public void init2()
             //in real life this will be done from the db
             Traveler d = new Traveler();
             Traveler e = new Traveler();
             Traveler f = new Traveler();
             Traveler g = new Traveler();
             d.setFirstName("John");
             d.setLastName("Smith");
             d.setSprot("Tennis");
             d.setNumYears(32);
             d.setVegetarian(true);
             e.setFirstName("Ron");
             e.setLastName("Cohen");
             e.setSprot("Baseball");
             e.setNumYears(12);
             e.setVegetarian(true);
             f.setFirstName("Donald");
             f.setLastName("Mac Novice");
             f.setSprot("Vallyball");
             f.setNumYears(1);
             f.setVegetarian(true);
             g.setFirstName("Eithan");
             g.setLastName("Superstar");
             g.setSprot("Vallyball");
             g.setNumYears(21);
             g.setVegetarian(true);
             defaultListModel.addElement(d);
             defaultListModel.addElement(e);
             defaultListModel.addElement(f);
             defaultListModel.addElement(g);            
        class MyTableModel extends AbstractTableModel
             private DefaultListModel myModel;
             public MyTableModel(DefaultListModel m)
                  myModel=m;
            private String[] columnNames = {"First Name",
                                            "Last Name",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            public int getColumnCount()
                return columnNames.length;
            public int getRowCount()
                return myModel.size();
            public String getColumnName(int column)
                 return getNames()[column];             
             public String[] getNames()
                  String[] names = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
                  return names;
            public Object getValueAt(int row, int col)
                 return distributeObjectsInTable(row, col, (Traveler) myModel.elementAt(row));
            public Object distributeObjectsInTable(int row, int col, Traveler tr)
               switch(col)
                         case 0:
                              return tr.getFirstName();
                         case 1:
                           return tr.getLastName();
                      case 2:
                           return tr.getSprot();
                      case 3:
                           return new Integer(tr.getNumYears());
                      case 4:
                           return new Boolean (tr.isVegetarian());
                     default:
                         return "Error";
            public Class getColumnClass(int c)
                return getValueAt(0, c).getClass();
        private static void createAndShowGUI()
            //Make sure we have nice window decorations.
            JFrame.setDefaultLookAndFeelDecorated(true);
            //Create and set up the window.
            JFrame frame = new JFrame("TableSorterDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //Create and set up the content pane.
            TableSorterDemo newContentPane = new TableSorterDemo();
            newContentPane.getPanel().setOpaque(true); //content panes must be opaque
            frame.setContentPane(newContentPane.getPanel());
            //Display the window.
            frame.pack();
            frame.setVisible(true);
        public static void main(String[] args)
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable()                   
                public void run()
                    createAndShowGUI();
         public void actionPerformed(ActionEvent ae)
              if (ae.getSource()==clickMe)
                   defaultListModel.removeAllElements();
                   init2(); //if the size of the model was less than 2 items - the result will be ok.
                              //in other words, if you commens the last 2 rows of this method (addElement(f) & g)
                             // the result will be fine.
                   table.updateUI();          
    }//(2) Traveler
    package sorter;
    public class Traveler
         private String firstName;
         private String lastName;
         private String sprot;
         private int numYears;
         private boolean vegetarian;
         public String getFirstName()
              return firstName;
         public String getLastName()
              return lastName;
         public int getNumYears()
              return numYears;
         public String getSprot()
              return sprot;
         public boolean isVegetarian()
              return vegetarian;
         public void setFirstName(String firstName)
              this.firstName = firstName;
         public void setLastName(String lastName)
              this.lastName = lastName;
         public void setNumYears(int numYears)
              this.numYears = numYears;
         public void setSprot(String sprot)
              this.sprot = sprot;
         public void setVegetarian(boolean vegetarian)
              this.vegetarian = vegetarian;
    }//(3)TableSorter
    package sorter;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.util.List;
    import javax.swing.*;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.*;
    public class TableSorter extends AbstractTableModel {
        protected TableModel tableModel;
        public static final int DESCENDING = -1;
        public static final int NOT_SORTED = 0;
        public static final int ASCENDING = 1;
        private static Directive EMPTY_DIRECTIVE = new Directive(-1, NOT_SORTED);
        public static final Comparator COMPARABLE_COMAPRATOR = new Comparator() {
            public int compare(Object o1, Object o2) {
                return ((Comparable) o1).compareTo(o2);
        public static final Comparator LEXICAL_COMPARATOR = new Comparator() {
            public int compare(Object o1, Object o2) {
                return o1.toString().compareTo(o2.toString());
        private Row[] viewToModel;
        private int[] modelToView;
        private JTableHeader tableHeader;
        private MouseListener mouseListener;
        private TableModelListener tableModelListener;
        private Map columnComparators = new HashMap();
        private List sortingColumns = new ArrayList();
        public TableSorter() {
            this.mouseListener = new MouseHandler();
            this.tableModelListener = new TableModelHandler();
        public TableSorter(TableModel tableModel) {
            this();
            setTableModel(tableModel);
        public TableSorter(TableModel tableModel, JTableHeader tableHeader) {
            this();
            setTableHeader(tableHeader);
            setTableModel(tableModel);
        private void clearSortingState() {
            viewToModel = null;
            modelToView = null;
        public TableModel getTableModel() {
            return tableModel;
        public void setTableModel(TableModel tableModel) {
            if (this.tableModel != null) {
                this.tableModel.removeTableModelListener(tableModelListener);
            this.tableModel = tableModel;
            if (this.tableModel != null) {
                this.tableModel.addTableModelListener(tableModelListener);
            clearSortingState();
            fireTableStructureChanged();
        public JTableHeader getTableHeader() {
            return tableHeader;
        public void setTableHeader(JTableHeader tableHeader) {
            if (this.tableHeader != null) {
                this.tableHeader.removeMouseListener(mouseListener);
                TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
                if (defaultRenderer instanceof SortableHeaderRenderer) {
                    this.tableHeader.setDefaultRenderer(((SortableHeaderRenderer) defaultRenderer).tableCellRenderer);
            this.tableHeader = tableHeader;
            if (this.tableHeader != null) {
                this.tableHeader.addMouseListener(mouseListener);
                this.tableHeader.setDefaultRenderer(
                        new SortableHeaderRenderer(this.tableHeader.getDefaultRenderer()));
        public boolean isSorting() {
            return sortingColumns.size() != 0;
        private Directive getDirective(int column) {
            for (int i = 0; i < sortingColumns.size(); i++) {
                Directive directive = (Directive)sortingColumns.get(i);
                if (directive.column == column) {
                    return directive;
            return EMPTY_DIRECTIVE;
        public int getSortingStatus(int column) {
            return getDirective(column).direction;
        private void sortingStatusChanged() {
            clearSortingState();
            fireTableDataChanged();
            if (tableHeader != null) {
                tableHeader.repaint();
        public void setSortingStatus(int column, int status) {
            Directive directive = getDirective(column);
            if (directive != EMPTY_DIRECTIVE) {
                sortingColumns.remove(directive);
            if (status != NOT_SORTED) {
                sortingColumns.add(new Directive(column, status));
            sortingStatusChanged();
        protected Icon getHeaderRendererIcon(int column, int size) {
            Directive directive = getDirective(column);
            if (directive == EMPTY_DIRECTIVE) {
                return null;
            return new Arrow(directive.direction == DESCENDING, size, sortingColumns.indexOf(directive));
        private void cancelSorting() {
            sortingColumns.clear();
            sortingStatusChanged();
        public void setColumnComparator(Class type, Comparator comparator) {
            if (comparator == null) {
                columnComparators.remove(type);
            } else {
                columnComparators.put(type, comparator);
        protected Comparator getComparator(int column) {
            Class columnType = tableModel.getColumnClass(column);
            Comparator comparator = (Comparator) columnComparators.get(columnType);
            if (comparator != null) {
                return comparator;
            if (Comparable.class.isAssignableFrom(columnType)) {
                return COMPARABLE_COMAPRATOR;
            return LEXICAL_COMPARATOR;
        private Row[] getViewToModel() {
            if (viewToModel == null) {
                int tableModelRowCount = tableModel.getRowCount();
                viewToModel = new Row[tableModelRowCount];
                for (int row = 0; row < tableModelRowCount; row++) {
                    viewToModel[row] = new Row(row);
                if (isSorting()) {
                    Arrays.sort(viewToModel);
            return viewToModel;
        public int modelIndex(int viewIndex)
            return getViewToModel()[viewIndex].modelIndex;
        private int[] getModelToView()
            if (modelToView == null) {
                int n = getViewToModel().length;
                modelToView = new int[n];
                for (int i = 0; i < n; i++) {
                    modelToView[modelIndex(i)] = i;
            return modelToView;
        // TableModel interface methods
        public int getRowCount() {
            return (tableModel == null) ? 0 : tableModel.getRowCount();
        public int getColumnCount() {
            return (tableModel == null) ? 0 : tableModel.getColumnCount();
        public String getColumnName(int column) {
            return tableModel.getColumnName(column);
        public Class getColumnClass(int column) {
            return tableModel.getColumnClass(column);
        public boolean isCellEditable(int row, int column) {
            return tableModel.isCellEditable(modelIndex(row), column);
        public Object getValueAt(int row, int column) {
            return tableModel.getValueAt(modelIndex(row), column);
        public void setValueAt(Object aValue, int row, int column) {
            tableModel.setValueAt(aValue, modelIndex(row), column);
        // Helper classes
        private class Row implements Comparable {
            private int modelIndex;
            public Row(int index) {
                this.modelIndex = index;
            public int compareTo(Object o) {
                int row1 = modelIndex;
                int row2 = ((Row) o).modelIndex;
                for (Iterator it = sortingColumns.iterator(); it.hasNext();) {
                    Directive directive = (Directive) it.next();
                    int column = directive.column;
                    Object o1 = tableModel.getValueAt(row1, column);
                    Object o2 = tableModel.getValueAt(row2, column);
                    int comparison = 0;
                    // Define null less than everything, except null.
                    if (o1 == null && o2 == null) {
                        comparison = 0;
                    } else if (o1 == null) {
                        comparison = -1;
                    } else if (o2 == null) {
                        comparison = 1;
                    } else {
                        comparison = getComparator(column).compare(o1, o2);
                    if (comparison != 0) {
                        return directive.direction == DESCENDING ? -comparison : comparison;
                return 0;
        private class TableModelHandler implements TableModelListener {
            public void tableChanged(TableModelEvent e) {
                // If we're not sorting by anything, just pass the event along.            
                if (!isSorting()) {
                    clearSortingState();
                    fireTableChanged(e);
                    return;
                // If the table structure has changed, cancel the sorting; the            
                // sorting columns may have been either moved or deleted from            
                // the model.
                if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
                    cancelSorting();
                    fireTableChanged(e);
                    return;
                // We can map a cell event through to the view without widening            
                // when the following conditions apply:
                // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and,
                // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and,
                // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and,
                // d) a reverse lookup will not trigger a sort (modelToView != null)
                // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS.
                // The last check, for (modelToView != null) is to see if modelToView
                // is already allocated. If we don't do this check; sorting can become
                // a performance bottleneck for applications where cells 
                // change rapidly in different parts of the table. If cells
                // change alternately in the sorting column and then outside of            
                // it this class can end up re-sorting on alternate cell updates -
                // which can be a performance problem for large tables. The last
                // clause avoids this problem.
                int column = e.getColumn();
                if (e.getFirstRow() == e.getLastRow()
                        && column != TableModelEvent.ALL_COLUMNS
                        && getSortingStatus(column) == NOT_SORTED
                        && modelToView != null) {
                    int viewIndex = getModelToView()[e.getFirstRow()];
                    fireTableChanged(new TableModelEvent(TableSorter.this,
                                                         viewIndex, viewIndex,
                                                         column, e.getType()));
                    return;
                // Something has happened to the data that may have invalidated the row order.
                clearSortingState();
                fireTableDataChanged();
                return;
        private class MouseHandler extends MouseAdapter {
            public void mouseClicked(MouseEvent e) {
                JTableHeader h = (JTableHeader) e.getSource();
                TableColumnModel columnModel = h.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX());
                int column = columnModel.getColumn(viewColumn).getModelIndex();
                if (column != -1) {
                    int status = getSortingStatus(column);
                    if (!e.isControlDown()) {
                        cancelSorting();
                    // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or
                    // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed.
                    status = status + (e.isShiftDown() ? -1 : 1);
                    status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1}
                    setSortingStatus(column, status);
        private static class Arrow implements Icon {
            private boolean descending;
            private int size;
            private int priority;
            public Arrow(boolean descending, int size, int priority) {
                this.descending = descending;
                this.size = size;
                this.priority = priority;
            public void paintIcon(Component c, Graphics g, int x, int y) {
                Color color = c == null ? Color.GRAY : c.getBackground();            
                // In a compound sort, make each succesive triangle 20%
                // smaller than the previous one.
                int dx = (int)(size/2*Math.pow(0.8, priority));
                int dy = descending ? dx : -dx;
                // Align icon (roughly) with font baseline.
                y = y + 5*size/6 + (descending ? -dy : 0);
                int shift = descending ? 1 : -1;
                g.translate(x, y);
                // Right diagonal.
                g.setColor(color.darker());
                g.drawLine(dx / 2, dy, 0, 0);
                g.drawLine(dx / 2, dy + shift, 0, shift);
                // Left diagonal.
                g.setColor(color.brighter());
                g.drawLine(dx / 2, dy, dx, 0);
                g.drawLine(dx / 2, dy + shift, dx, shift);
                // Horizontal line.
                if (descending) {
                    g.setColor(color.darker().darker());
                } else {
                    g.setColor(color.brighter().brighter());
                g.drawLine(dx, 0, 0, 0);
                g.setColor(color);
                g.translate(-x, -y);
            public int getIconWidth() {
                return size;
            public int getIconHeight() {
                return size;
        private class SortableHeaderRenderer implements TableCellRenderer {
            private TableCellRenderer tableCellRenderer;
            public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
                this.tableCellRenderer = tableCellRenderer;
            public Component getTableCellRendererComponent(JTable table,
                                                           Object value,
                                                           boolean isSelected,
                                                           boolean hasFocus,
                                                           int row,
                                                           int column) {
                Component c = tableCellRenderer.getTableCellRendererComponent(table,
                        value, isSelected, hasFocus, row, column);
                if (c instanceof JLabel) {
                    JLabel l = (JLabel) c;
                    l.setHorizontalTextPosition(JLabel.LEFT);
                    int modelColumn = table.convertColumnIndexToModel(column);
                    l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont().getSize()));
                return c;
        private static class Directive {
            private int column;
            private int direction;
            public Directive(int column, int direction) {
                this.column = column;
                this.direction = direction;
    }

    The table listens to the TableModel for changes. Changing the table by adding/removing
    rows or columns has no affect on its table model. If you make changes to the table model
    the table will be notified by its TableModelListener and change its view. So tell
    MyTableModel about the change of data:
    public class TableSorterDemo implements ActionListener
        MyTableModel tableModel;
        public TableSorterDemo()
            defaultListModel = new DefaultListModel();
            init1();
            tableModel = new MyTableModel(defaultListModel);
            TableSorter sorter = new TableSorter(tableModel);
        public void actionPerformed(ActionEvent ae)
            if (ae.getSource()==clickMe)
                defaultListModel.removeAllElements();
                init2();
                tableModel.fireTableStructureChanged();
    }

  • JTable printing problem

    Hi , I have a problem add printing routine for printing to this code.
    Sombody help me.
    I no post all code but my prube no functioned.
    thanks you
    code :
    package com.froses.tablemodels;
    * SimpleDBTable.java
    * A demonstration of using ODBC to read data from an Access database
    * and display the values in a JTable.
    * This file requires that the new.mdb file exists and has been mapped
    * using ODBC to a datastore named 'newdb' with blank username and password.
    * Gordon Branson January 2004
    import javax.swing.*;
    import java.awt.Dimension;
    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    public class SimpleDBTable extends JPanel {
    private boolean DEBUG = true;
    private int rows = 10, cols = 5;
    private String url = "jdbc:odbc:Sego";
    private Connection con;
    private Statement stmt;
    private JButton btnRead, btnDelete, btnWrite, btnClose;
              /* Setup the table column names */
    private String[] columnNames = {"Medico",
    "Descripci�n",
    "Obra social",
    "Items",
    "Codigo"};
              /* declare an Object array large enough to hold the database table */
    private Object[][] data = new Object[rows][cols];
    private JTable table;
    public SimpleDBTable() {
    super(new BorderLayout());
    /* Load ODBC diver */
    try {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    } catch(java.lang.ClassNotFoundException e) {
    System.err.print("ClassNotFoundException: ");
    System.err.println(e.getMessage());
              /* create the JTable */
    table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 300));
    /* Now read from the database */
    populateTable();
    if (DEBUG) {
    table.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
    printDebugData();
    //Create the Title Label.
    JLabel title = new JLabel("Database Access in Java");
    title.setFont(new java.awt.Font("Arial", 1, 24));
    title.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    //Add the label to this panel.
    add("North",title);
    //Create the scroll pane and add the JTable to it.
    JScrollPane scrollPane = new JScrollPane(table);
    //Add the scroll pane to this panel.
    add("Center",scrollPane);
    // Create a button panel with a default layout
    JPanel buttons = new JPanel();
    // Create the buttons
    btnRead = new JButton("Read");
    btnClose = new JButton("Close");
    btnWrite = new JButton("Write");
    btnDelete = new JButton("Delete");
    // Add action listeners
    btnRead.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    populateTable();
    btnDelete.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    deleteTable();
    btnWrite.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    writeTable();
    btnClose.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    System.exit(0);
    // Add the buttons to the button panel
    buttons.add(btnRead);
    buttons.add(btnWrite);
    buttons.add(btnDelete);
    buttons.add(btnClose);
    // Add the buttons panel to main panel
    add("South",buttons);
    private void populateTable(){
         /* Define the SQL Query to get all data from the database table */
    String query = "SELECT * FROM Datos";
    /* First clear the JTable */
    clearTable();
    /* get a handle for the JTable */
    javax.swing.table.TableModel model = table.getModel();
    int r = 0;
    try {
    /* connect to the database */
    con = DriverManager.getConnection(url, "", "");
    stmt = con.createStatement();
    /* run the Query getting the results into rs */
                   ResultSet rs = stmt.executeQuery(query);
                   while ((rs.next()) && (r<rows)) {
                        /* for each row get the fields
                        note the use of Object - necessary
                        to put the values into the JTable */
                   Object nm = rs.getObject("Medico_solic");
                   Object sup = rs.getObject("Descip_Item");
                   Object pri = rs.getObject("Obra_Social");
                   Object sal = rs.getObject("M�dico_opera");
                   Object tot = rs.getObject("Codigo_estudio");
                   model.setValueAt(nm, r, 0);
                   model.setValueAt(sup, r, 1);
                   model.setValueAt(pri, r, 2);
                   model.setValueAt(sal, r, 3);
                   model.setValueAt(tot, r, 4);
                   r++;
    stmt.close();
    con.close();
    } catch(SQLException ex) {
    System.err.println("SQLException: " + ex.getMessage());
    private void deleteTable(){
         emptyTable();
         clearTable();
    private void emptyTable(){
         /* Define the SQL Query to get all data from the database table */
    String query = "DELETE * FROM COFFEES";
    try {
    /* connect to the database */
    con = DriverManager.getConnection(url, "", "");
    stmt = con.createStatement();
    /* run the Query */
                   stmt.executeUpdate(query);
    stmt.close();
    con.close();
    } catch(SQLException ex) {
    System.err.println("SQLException: " + ex.getMessage());
    /* private void writeTable(){
         /* First clear the table */
    /*      emptyTable();
         PreparedStatement insertRow;// = con.prepareStatement(
         String insertString = "INSERT INTO COFFEES " +
                                  "VALUES (?, ?, ?, ?, ?)";
    int numRows = table.getRowCount();
    javax.swing.table.TableModel model = table.getModel();
    Integer sup, sal, tot;
    Double pri;
    Object o;
    if(DEBUG) System.out.println("\nDoing Write...");
    try {
    /* connect to the database */
    /* con = DriverManager.getConnection(url, "", "");
    insertRow = con.prepareStatement(insertString);
         for (int r=0; r < numRows; r++) {
              if (model.getValueAt(r, 0) != null){
                   insertRow.setString(1, (String) model.getValueAt(r, 0));
                   //o = model.getValueAt(r, 1);
                   if(DEBUG) System.out.println(model.getValueAt(r, 1).toString());
                   sup = new Integer((String) model.getValueAt(r, 1));
                   insertRow.setInt(2, sup.intValue());
                   pri = new Double((String) model.getValueAt(r, 2));
                   insertRow.setDouble(3, pri.doubleValue());
                   sal = new Integer((String) model.getValueAt(r, 3));
                   insertRow.setInt(4, sal.intValue());
                   tot = new Integer((String) model.getValueAt(r, 4));
                   insertRow.setInt(5, tot.intValue());
                   insertRow.executeUpdate();
                   System.out.println("Writing Row " + r);
    insertRow.close();
    con.close();
    } catch(SQLException ex) {
    System.err.println("SQLException: " + ex.getMessage());
    clearTable();
    private void writeTable(){
         /* First clear the table */
         emptyTable();
         Statement insertRow;// = con.prepareStatement(
         String baseString = "INSERT INTO Datos " +
                                  "VALUES ('";
         String insertString;
    int numRows = table.getRowCount();
    javax.swing.table.TableModel model = table.getModel();
    Integer sup, sal, tot;
    Double pri;
    Object o;
    if(DEBUG) System.out.println("\nDoing Write...");
    try {
    /* connect to the database */
    con = DriverManager.getConnection(url, "", "");
         for (int r=0; r < numRows; r++) {
              if (model.getValueAt(r, 0) != null){
                   insertString = baseString + model.getValueAt(r, 0)+"',";
                   insertString = insertString + model.getValueAt(r, 1)+",";
                   insertString = insertString + model.getValueAt(r, 2)+",";
                   insertString = insertString + model.getValueAt(r, 3)+",";
                   insertString = insertString + model.getValueAt(r, 4)+");";
                   if(DEBUG) System.out.println(insertString);
              insertRow = con.createStatement();
                   insertRow.executeUpdate(insertString);
                   System.out.println("Writing Row " + r);
    insertRow.close();
    con.close();
    } catch(SQLException ex) {
    System.err.println("SQLException: " + ex.getMessage());
    clearTable();
    private void clearTable(){
    int numRows = table.getRowCount();
    int numCols = table.getColumnCount();
    javax.swing.table.TableModel model = table.getModel();
    for (int i=0; i < numRows; i++) {
    for (int j=0; j < numCols; j++) {
    model.setValueAt(null, i, j);
    private void printDebugData() {
    int numRows = table.getRowCount();
    int numCols = table.getColumnCount();
    javax.swing.table.TableModel model = table.getModel();
    System.out.println("Value of data: ");
    for (int i=0; i < numRows; i++) {
    System.out.print(" row " + i + ":");
    for (int j=0; j < numCols; j++) {
    System.out.print(" " + model.getValueAt(i, j));
    System.out.println();
    System.out.println("--------------------------");
    * Create the GUI and show it. For thread safety,
    * this method should be invoked from the
    * event-dispatching thread.
    private static void createAndShowGUI() {
    //Make sure we have nice window decorations.
    JFrame.setDefaultLookAndFeelDecorated(true);
    //Create and set up the window.
    JFrame frame = new JFrame("SimpleDBTable");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //Create and set up the content pane.
    SimpleDBTable newContentPane = new SimpleDBTable();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
    //Display the window.
    frame.pack();
    frame.setVisible(true);
    public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    createAndShowGUI();
    }

    http://forum.java.sun.com/thread.jspa?threadID=626207

  • JTable rendering problem in JRE 1.6.0.10 under Linux

    I've encountered a bizarre issue using JTable. I've got a 3x10 JTable of Strings, values in which I change from within the program (no user input). After every update the value in the first column gets superimposed on the top of the previous one, so they are both visible, but totally unreadable (they interlace).
    I'm using Linux, and it only happens under jre 1.6.0.10. When I switch to 1.5.0.16 it works fine. I also noticed, that if I set the value to null in the first column and then set it to the new value it works fine. However, if I do it simply like that:
    table.setValueAt(null, 1, 0);
    table.setValueAt(newValue, 1, 0);it doesn't work. I need to re-set it to null on one user's click (it triggers the update) and only change it on the following click. Am I reporting a bug here, or is it a known issue with some proper solution?
    Thanks

    There are some crazy things, I can't explain...
    1) Here is my [sample project|http://vlkv.storm-soft.kiev.ua/_mywiki/images/6/6f/JavaApplication1.tar.gz]. I've created it with NetBeans 6.5 and jdk 1.6.0_11.
    2) there are directories dist_windows, dist_linux with jars, created under Windows and Linux (same version JDK everywhere). You may compare both JavaApplication1.jar files with some diff tool (such as WinMerge) and you can see that these jars are slightly different. WHY?
    3) Run my sample
    java -jar JavaApplication1.jarpress the button and scroll up and down JTable. Under Windows everything is ok. But under Linux I have the subj bug with BOTH dist_windows/JavaApplication1.jar and dist_linux/JavaApplication1.jar !!!
    4) Start NetBeans 6.5 and open the project. Run the project from inside NetBeans on Linux. Then I see that my java program runs perfectly, without any bugs!!!
    This command
    ps fu -C javaproduces this output:
    vlkv 8778 1.0 2.8 217084 22408 ? Sl 14:01 0:00 \_ /usr/java/jdk1.6.0_11/bin/java -classpath /home/vlkv/NetBeansProjects/JavaApplication1/build/classes:/home/vlkv/NetBeansProjects/JavaApplication1/src NewJFrame
    But if I run NewJFrame without NetBeans like this (copy/paste command):
    /usr/java/jdk1.6.0_11/bin/java -classpath /home/vlkv/NetBeansProjects/JavaApplication1/build/classes:/home/vlkv/NetBeansProjects/JavaApplication1/src NewJFrame
    This bug returns!!! WHY UNDER NETBEANS IT'S OKAY?
    Where are the java experts to help us, please?
    PS: I've found a topic about this problem, unfortunately not answered, here .

Maybe you are looking for