Site icon Coding Dude

Java Swing JXTable tutorial – fixing the ColumnControlButton menu

In this post I will show you how you can keep open the menu of ColumnControlButton in a Java Swing application using JXTable.

The reason for this JXTable tutorial

Want to know what problems you may encounter when using the JXTable component amd how to tackle them? Read on.

Through a weird and unwanted series of events (often referred to as a “daytime job”) a project landed on my plate which involves the development of a Java desktop application using Swing.

Being mainly involved so far in web project it’s the first time I work on a real Swing project. The project deals a lot with tables as it mimics the functionality of an excel sheet and it’s using SwingLabs’s API JXTable.

And now, the problem…

During the project I ran into an interesting request which regarding modifying the default behavior of the ColumnControlButton. The ColumnControlButton is a button in the header of tables that allows the user to show or hide columns of the table.

By default this button activates a small popup menu with check-boxes for each column and as you select one column the popup disappears. The request was that the popup stays such that the user can easily show or hide more columns in one go.

As I have spent a bit of time trying to figure this out on my own I thought it would be nice to share the solution with you.

The solution

The solution involves creating a custom ColumnControlButton and setting it on the table.

...
JXTable table;
//create the custom ColumnControlButton
table.setColumnControl(new MyCustomColumnControlButton());
//make it visible
table.setColumnControlVisible(true);
...

And now, for the custom ColumnControlButton class

public class MyColumnControlButton extends ColumnControlButton {
	/*
	 * This modifies the popup menu that hides/shows table
	 * columns such that the popup is kept open even after a column is clicked.
	 * The popup will close if the ColumnControlButton is pressed again.
	 */
	@Override
	protected ColumnControlPopup createColumnControlPopup() {
		return new DefaultColumnControlPopup() {
			@Override
			public void addVisibilityActionItems(List<? extends AbstractActionExt> actions) {

				ActionContainerFactory factory = new ActionContainerFactory(null);
				for (Action action : actions) {
					JMenuItem mi = factory.createMenuItem(action);
					mi.setUI(new MyCheckBoxMenuItemUI());
					addItem(mi);
				}
			}

		};
	}

	//we do a simple override or the code executed when a column selected for
	//showing or hiding
	public static class MyCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI {
		public static ComponentUI createUI(JComponent c) {
			return new MyCheckBoxMenuItemUI();
		}

		synchronized protected void doClick(MenuSelectionManager msm) {
			menuItem.doClick(0);
		}
	}
}
Exit mobile version