Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7622619
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 31, 20262026-05-31T04:29:54+00:00 2026-05-31T04:29:54+00:00

I have following method in my class which extends JTable: protected void setTableCursor(Cursor cursor)

  • 0

I have following method in my class which extends JTable:

  protected void setTableCursor(Cursor cursor) {
// data gathering
cursor = (cursor != null) ? cursor : Cursor.getDefaultCursor();
JTableHeader header = getTableHeader();

// set
header.setCursor(cursor);
setCursor(cursor);
}

This method is called from time to time to show WAIT cursor when table is updated from DB.

The problem with it is that now when i try and resize columns I can’t see default SPLIT cursor. How this can be fixed? So I need to add some code in order for mouse cursor always show split cursor when mouse is near column’s edge.

Please also check example below. To reproduce issue just double-click on table header exactly on columns divider:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
abstract public class DemoTable extends JTable
{
protected DemoTable() {
    super();
    compose(false);
}
private void compose(boolean allowMultipleSelection) {
    setModel(new DefaultTableModel(getColumnNames(), 0));
    setColumnSelectionAllowed(false);
    getSelectionModel().setSelectionMode(allowMultipleSelection ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION);
    getTableHeader().setReorderingAllowed(false);
    getTableHeader().addMouseListener(new ColumnResizeListener(this));
}

protected void setTableCursor(Cursor cursor) {
    // data gathering
    cursor = (cursor != null) ? cursor : null;
    JTableHeader header = getTableHeader();
    // set
    header.setCursor(cursor);
    setCursor(cursor);
}

public void adjustColumnWidth(int column) {
    setPreferredColumnWidth(column, getPreferredSizeForColumn(column));
}

private int getPreferredSizeForColumn(int columnIndex) {
    // base setup
    int preferredWidth = 0;
    int rowCount = getRowCount();
    TableColumnModel columnModel = getColumnModel();
    TableColumn column = columnModel.getColumn(columnIndex);

    TableCellRenderer renderer;
    Component rendererComponent = null;

    // header
    renderer = column.getHeaderRenderer();
    if (renderer != null) {
        rendererComponent = renderer.getTableCellRendererComponent(this, column.getHeaderValue(), false, false, 0, 0);
        if (rendererComponent != null) {
            preferredWidth = rendererComponent.getPreferredSize().width;
        }
    }

    // rendered values
    Object value;
    for (int row = 0; row < rowCount; row++) {
        // base setup
        value = getValueAt(row, columnIndex);

        // renderer lookup
        renderer = getCellRenderer(row, columnIndex);
        if (renderer != null)
            rendererComponent = renderer.getTableCellRendererComponent(this, value, false, false, row, columnIndex);
        rendererComponent = (rendererComponent == null) ? new JLabel((value == null) ? "" : value.toString()) : rendererComponent;

        // calculate the preferred size
        preferredWidth = Math.max(preferredWidth, rendererComponent.getPreferredSize().width);
    }

    // exit
    return (preferredWidth <= 0) ? 25 : (preferredWidth + 15);
}

public void adjustColumnWidths() {

    Thread updateThread = new Thread()
    {
        public void run() {
            try {
                SwingUtilities.invokeAndWait(new Runnable()
                {
                    public void run() {
                        int columns = getModel().getColumnCount();
                        Map<Integer, Integer> preferredWidths = new HashMap<Integer, Integer>();
                        for (int column = 0; column < columns; column++)
                            preferredWidths.put(column, getPreferredSizeForColumn(column));

                        // run the sets
                        for (Map.Entry<Integer, Integer> column : preferredWidths.entrySet())
                            setPreferredColumnWidth(column.getKey(), column.getValue());
                    }
                });

                // pause momentarily to let the cursor update take place
                sleep(75);
            }
            catch (Exception e) {
                // ignore
            }
            finally {
                setTableCursor(null);
            }
        }
    };

    // execute the thread
    updateThread.start();
    if (updateThread.isAlive())
        setTableCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}

private void setPreferredColumnWidth(int column, int preferredWidth) {
    getColumnModel().getColumn(column).setPreferredWidth(preferredWidth);
}

abstract protected String[] getColumnNames();

@Override
public boolean isCellEditable(int row, int column) {
    return false;
}

private static class ColumnResizeListener extends MouseAdapter
{
    DemoTable table;
    public ColumnResizeListener(DemoTable table) {
        super();

        // attribute initialization
        this.table = table;
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() instanceof JTableHeader) {
            // data gathering
            int clicks = e.getClickCount();

            // single click
            if (clicks == 1) {
                int column = table.getColumnModel().getColumnIndexAtX(e.getX());
                table.adjustColumnWidth(column);
            }

            // double-click
            else if (clicks == 2)
                table.adjustColumnWidths();
        }
    }
}

public static void main(String args[]) {
    final DemoTable table = new DemoTable() {
        @Override
        protected String[] getColumnNames() {
            return new String[]{"one","two"};
        }
    };
    JFrame frame = new JFrame("Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ((DefaultTableModel)table.getModel()).addRow(new String[]{"1", "2"});
    ((DefaultTableModel)table.getModel()).addRow(new String[]{"1","2"});
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(table.getTableHeader(), BorderLayout.NORTH);
    panel.add(table, BorderLayout.CENTER);
    frame.add(panel);
    frame.pack();
    panel.setSize(new Dimension(200, 100));
    frame.setVisible(true);
}
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-31T04:29:56+00:00Added an answer on May 31, 2026 at 4:29 am

    Instead of default cursor set both cursors (for header and table) to null when no need to show WAIT cursor.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a public class which has the following method and instance variable: public
I have an interface A , which class B implements. The following generic method
I have a the following method definition in my class: virtual Calc* Compile( Evaluator*
I have a Repository Class with the following method... public T Single<T>(Predicate<T> expression) {
I have following event class. I have a question related to the Property method
I have the following class: public abstract class AbstractParent { static String method() {
Good day, I have the following problem: class B extends class A and methods
I have an AsyncTask which calls my LocationHandler class method getLocation() which runs a
I have the following classes: public class Obj<T> extends BaseModel { public static final
I have a JFrame (well, a class which extends JFrame) and I want to

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.