Build enterprise web apps in pure Java.
GXT is a comprehensive Java framework for building web apps with the GWT compiler. Write your UI in Java and compile it into highly optimized, cross-platform HTML5, with 140+ high-performance components ready to use.
com.sencha.gxt:gxt:4.2.0Download the SDK and add it to your Build Path. Full guide
# 1. Download the GXT SDK (free trial or support portal) and unzip it
# 2. Copy the GXT jars into your project and add them to the Build Path
# (next to the GWT SDK)
my-app/
lib/
gxt-4.2.0.jar # GXT components
gxt-chart-4.2.0.jar # optional: charts
gxt-theme-triton-4.2.0.jar # optional: Triton theme
src/
war/
Trusted by the world’s leading companies
Real apps. Real source code.
Start from a working reference app instead of a blank page. Every demo below is built with GXT, and the source is open on GitHub so you can fork it, read it, and reuse the patterns.
Executive Dashboard
A feature-rich admin application template that combines charts, grids and navigation in one Java app, styled with a custom theme generated by the Theme Builder. Use it as a starting point for internal analytics and reporting tools.
GXT Examples Explorer
Every major component in action: grids, charts, forms, trees, layouts, drag and drop, windows and more. Each example shows its Java source and runs under all four packaged themes.
Large Grids
Shows how to wire up GXT grids, and lets you experiment with simulated record sets of different sizes to see how the grids perform as your data grows.
Web Desktop
A desktop-style workspace in the browser, built from GXT windows, menus and toolbars, all written in Java. A good reference for multi-window, power-user applications.
Data-heavy back offices
Grids, editors and filters for operations, finance and admin teams.
Engineering & science systems
Document and equipment management like CERN’s EDMS web interface.
Control interfaces
Sophisticated, real-time operator consoles built entirely in Java.
Analytics & planning tools
Large-scale, web-centric apps with rich charting and modelling.
Typed, testable UI code. No JavaScript required.
GXT components are plain Java classes with generics, so your IDE catches mistakes at compile time. These snippets come from the official GXT examples. Pick a component to see how it’s built.
A grid built for business data
Handle large record sets with sorting, grouping, column reordering and saved state built in. Values are bound through generated PropertyAccess interfaces instead of strings.
- Compile-time safe columns with
ColumnConfig<M, V> - Custom cells, grouping, row numbering, row expanders and checkbox selection
- State management to remember column order, widths and sort
Scroll through big, server-side datasets
Connect a grid to your back end with a proxy and a loader. LiveGridView fetches rows as the user scrolls, so the browser only renders what’s visible.
- Proxies for GWT RPC, RequestFactory, JSON and XML
- Remote sort, filter and paging through
PagingLoadConfig - Paging toolbars or buffered live scrolling, your choice
Edit data in place
Plug row or inline editing into any grid and map each column to a form field. Add string, numeric, date, boolean and list filters to column menus in a few lines.
GridRowEditingandGridInlineEditingplugins- Converters between field and model types
- Local or remote filtering with
GridFilters
Visualize data from the same store
The gxt-chart module draws charts from the same ListStore your grids use. Update the store, redraw the chart.
- Line, area, bar, column, pie, radar, scatter and gauge series
- Stacked, grouped and mixed charts, live updates and tooltips
- Animation, highlighting, legends and themed colors
Forms with validation built in
Text, number, date, time, combo, spinner, slider, dual-list and file-upload fields come with labels, field sets and validators ready to use.
- Required fields and reusable validators like
MinLengthValidator - Data binding with the GWT Editor framework
- Declarative layouts with UiBinder if you prefer XML
Layouts that size themselves
GXT’s layout system takes care of sizing and positioning every component, even in the most complex screens, so you don’t have to fight CSS.
- Border, VBox, HBox, card, accordion, center and portal layouts
- Collapsible, split-resizable regions
HtmlLayoutContainerfor fluid, responsive designs
Hierarchies, ready to use
Show folders, org charts and bills of materials in a Tree or a TreeGrid, backed by a TreeStore that loads data locally or on demand.
- Async loading for very large hierarchies
- Checkbox trees with parent/child cascading
- Drag-and-drop reordering, filtering and context menus
140+ components. One Java API.
High-performance, fully customizable UI components that work alongside native GWT widgets, templates and the layout manager. Hundreds of user extensions are also available from the Sencha community.
Grids
Grid · LiveGridView · GroupingView · Aggregation · RowExpander · CheckBox selection
Charts
Line · Area · Bar · Column · Pie · Radar · Scatter · Gauge
Forms & fields
TextField · ComboBox · DateField · Spinner · Slider · DualListField · FileUpload
Layouts
BorderLayout · VBox / HBox · Accordion · Card · Portal · HtmlLayout
Trees & TreeGrids
Tree · TreeGrid · Async loading · Checkbox trees · Filtering
Windows & dialogs
Window · Dialog · MessageBox · WindowManager · Notifications
Menus, toolbars & tabs
MenuBar · ToolBar · Overflow toolbar · Status toolbar · TabPanel
Drag & drop
Grid, list and tree DnD · Draggable · Resizable · Reordering
Data package
ListStore · TreeStore · Loaders · RPC / JSON / XML proxies · Sorting & filtering
Data binding
Editor framework · List & grid binding · RequestFactory binding
Views & templates
ListView · XTemplates · Custom cells · QuickTips & ToolTips
Draw & state
Draw sprites · Animation · StateManager for grids, trees and layouts
Change the look with one line.
Every GXT widget is themed. Choose one of four packaged themes by inheriting its module, or generate your own theme from a short config file with the Theme Builder.
| Company | Symbol | Last | Change |
|---|---|---|---|
| Northwind Traders | NWT | 71.72 | +0.02 |
| Contoso Ltd | CTSO | 29.01 | +0.42 |
| Fabrikam Inc | FBKM | 83.81 | -0.28 |
| Tailspin Toys | TSPN | 52.55 | +0.01 |
| Adventure Works | ADVW | 64.13 | -0.31 |
Enable one theme at a time per EntryPoint. Triton and Neptune ship as separate jars (gxt-theme-triton, gxt-theme-neptune); Blue is the default.
Theme Builder: your brand, generated
Describe colors, fonts, borders, radii and gradients in a simple config, and the Theme Builder generates a jar containing every appearance your app needs. With more than 350 configuration properties, you can theme almost every widget and cell in GXT. Triton itself was generated this way.
Fits the Java toolchain you already use.
GXT is a Java library and a GWT module, so it works with your existing IDE, build and back end, and your team can stay in one language from server to UI.
Eclipse & IntelliJ IDEA
Step-by-step guides for creating standard or Maven-based GXT projects in either IDE. You get full refactoring, debugging and code completion on your UI code.
Maven & archetypes
Pull GXT, charts and themes from Sencha’s MyGet Maven repository, or scaffold a sandbox project, theme module included, from the GXT archetypes.
Super Dev Mode
Fast refresh cycles in any browser, against local or remote servers. Edit Java, reload, and see the change.
Connect to any back end
The data package is protocol agnostic. Load from GWT RPC, RequestFactory, JSON or XML, and keep client-side models with sorting and filtering.
Java or UiBinder
Build screens in code or declaratively with GWT UiBinder. Most Explorer examples come in both styles so you can compare.
Works with native GWT
GXT components interoperate with native GWT widgets, so you can adopt GXT one screen at a time. GXT 4 also adds support for touch devices and modern browsers.
Keeping pace with Java and GWT.
GXT 4.0
- Touch device and modern browser support
- New Triton theme, generated with the Theme Builder
- GWT 2.7.0 and 2.8.2 support
- Java 6, 7, 8 and 9 support
GXT 4.1
- Java 11 support
- GWT 2.9.0 support
GXT 4.2
- Java LTS 11, 17 and 21
- GWT 2.11.0, with improved Java emulation and runtime fixes
- Write front-end and back-end code with modern Java syntax
Still on GXT 2?
Move to GXT 4 for Super Dev Mode, faster compiles, current Java and touch support. Sencha Professional Services can help you plan and run the upgrade.
Security & Compliance



Real companies, real results with GXT.
Everything you need to ship with GXT.
Documentation
Getting started, API reference, theming and Maven guides for GXT 4.x.
Examples
The Examples Explorer and Admin Dashboard template, running live.
Fork-able templates
Demo project templates and archetypes on GitHub, ready to clone.
Ask Sencha AI
Ask GXT questions in plain language and get answers grounded in the docs.
Community
Join Sencha developers on Discord and Stack Overflow.
Support & training
Standard and premium support, plus professional services and training.
Frequently asked questions
What is Sencha GXT?
GXT is a comprehensive Java framework for building web apps with the GWT (formerly Google Web Toolkit) compiler. You write your app in Java, and GWT compiles it into highly optimized, cross-platform HTML5 code. GXT provides 140+ high-performance, customizable UI components, including grids, trees, lists, forms, menus, toolbars, panels, windows and charts.
Which Java and GWT versions does GXT support?
GXT 4.2.x supports Java LTS 11, 17 and 21 with GWT 2.11.0. GXT 4.1.x supports Java 11 with GWT 2.9.0.
How do I add GXT to a Maven project?
Add the Sencha MyGet repository (https://sencha.myget.org/F/maven/maven/) to your pom.xml, put your support-portal credentials in ~/.m2/settings.xml, then add the com.sencha.gxt:gxt dependency, plus gxt-chart or a theme jar if you need them. To get MyGet access, reach out to our sales team. See the Maven guide.
Can I try GXT before buying?
Yes. The fully featured GXT is available as a free 30-day trial. Start your trial.
Does GXT work with my existing GWT code?
Yes. GXT components interoperate with native GWT components, templates and the layout manager, so you can add GXT to an existing GWT app and adopt it screen by screen. Configure your GWT module to inherit com.sencha.gxt.ui.GXT to get started.
Which themes are included, and can I create my own?
GXT ships with four themes: Blue (the default), Gray, Neptune and Triton. To build your own, the Theme Builder takes a simple config file and generates a jar with all the appearances your app needs, using more than 350 configuration properties. Sencha Professional Services can also build a custom theme for you.
Does GXT support touch devices?
Yes. GXT 4 adds support for touch devices and modern browsers, so the same Java codebase serves desktop and tablet users.
We’re on GXT 2. Can you help us upgrade?
Yes. GXT 2 is no longer supported and doesn’t work with GWT 2.8.2 and later, Super Dev Mode, or touch devices. Sencha Professional Services offer upgrades from GXT 2 to GXT 4, a fast track to GXT development, and custom consulting. Contact Professional Services.
Where can I get help?
Use the documentation, Ask Sencha AI, the Sencha community on Discord, or the support options, including premium support.
Considering GXT for your business?
Book a demo with a Sencha GXT expert to see how our performance, Sencha tooling and dedicated support services can help your organization build modern web apps faster.
# 1. Download the GXT SDK (free trial or support portal) and unzip it
# 2. Copy the GXT jars into your project and add them to the Build Path
# (next to the GWT SDK)
my-app/
lib/
gxt-4.2.0.jar # GXT components
gxt-chart-4.2.0.jar # optional: charts
gxt-theme-triton-4.2.0.jar # optional: Triton theme
src/
war/
<?xml version="1.0" encoding="UTF-8"?> <module rename-to="app"> <inherits name="com.google.gwt.user.User" /> <!-- Remove GWT's Clean theme if your project has it --> <!-- <inherits name="com.google.gwt.user.theme.clean.Clean" /> --> <!-- GXT + the default GXT stylesheet --> <inherits name="com.sencha.gxt.ui.GXT" /> <stylesheet src="reset.css" /> <inherits name="com.sencha.gxt.theme.triton.Theme" /> <entry-point class="com.example.client.App" /> <source path="client" /> </module>
<!-- GXT needs the HTML5 doctype -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My GXT App</title>
<script src="app/app.nocache.js"></script>
</head>
<body></body>
</html>
package com.example.client;
public class App implements EntryPoint {
@Override
public void onModuleLoad() {
TextButton hello = new TextButton("Say hello");
hello.addSelectHandler(event ->
new MessageBox("GXT", "Hello from Java!").show());
ContentPanel panel = new ContentPanel();
panel.setHeading("My first GXT app");
panel.add(hello);
Viewport viewport = new Viewport();
viewport.setWidget(panel);
RootPanel.get().add(viewport);
}
}
// Generated, type-safe accessors for the Stock bean
interface StockProperties extends PropertyAccess<Stock> {
@Path("symbol")
ModelKeyProvider<Stock> key();
ValueProvider<Stock, String> name();
ValueProvider<Stock, Double> last();
ValueProvider<Stock, Double> change();
}
StockProperties props = GWT.create(StockProperties.class);
ColumnConfig<Stock, String> nameCol = new ColumnConfig<>(props.name(), 150, "Company");
ColumnConfig<Stock, Double> lastCol = new ColumnConfig<>(props.last(), 75, "Last");
ColumnConfig<Stock, Double> changeCol = new ColumnConfig<>(props.change(), 75, "Change");
List<ColumnConfig<Stock, ?>> columns = new ArrayList<>();
columns.add(nameCol);
columns.add(lastCol);
columns.add(changeCol);
ListStore<Stock> store = new ListStore<>(props.key());
store.addAll(stocks);
Grid<Stock> grid = new Grid<>(store, new ColumnModel<>(columns));
grid.getView().setAutoExpandColumn(nameCol);
grid.getView().setStripeRows(true);
grid.setColumnReordering(true);
// Remember column order, widths and sort between visits
grid.setStateful(true);
grid.setStateId("stockGrid");
new GridStateHandler<>(grid).loadState();
// Load pages of data from the server via GWT RPC
RpcProxy<PagingLoadConfig, PagingLoadResult<Post>> proxy =
new RpcProxy<PagingLoadConfig, PagingLoadResult<Post>>() {
@Override
public void load(PagingLoadConfig config,
AsyncCallback<PagingLoadResult<Post>> callback) {
service.getPosts(config, callback);
}
};
PagingLoader<PagingLoadConfig, PagingLoadResult<Post>> loader =
new PagingLoader<>(proxy);
loader.setRemoteSort(true);
// Only fetch and render the rows the user can see
LiveGridView<Post> liveView = new LiveGridView<>();
liveView.setAutoExpandColumn(subjectColumn);
Grid<Post> grid = new Grid<>(store, columnModel);
grid.setLoader(loader);
grid.setView(liveView);
grid.setLoadMask(true);
// Once the grid is attached, load the first cache-sized block
loader.load(0, liveView.getCacheSize());
// Row editing: map each column to a field GridRowEditing<Plant> editing = new GridRowEditing<>(grid); editing.addEditor(nameColumn, new TextField()); editing.addEditor(availableColumn, new DateField()); editing.addEditor(indoorColumn, new CheckBox()); // Column-menu filters, applied locally GridFilters<Plant> filters = new GridFilters<>(); filters.initPlugin(grid); filters.setLocal(true); filters.addFilter(new StringFilter<>(props.name())); filters.addFilter(new DateFilter<>(props.available())); filters.addFilter(new BooleanFilter<>(props.indoor()));
NumericAxis<Data> hits = new NumericAxis<>(); hits.setPosition(Position.BOTTOM); hits.addField(access.data1()); hits.setDisplayGrid(true); hits.setMinimum(0); CategoryAxis<Data, String> months = new CategoryAxis<>(); months.setPosition(Position.LEFT); months.setField(access.name()); BarSeries<Data> bars = new BarSeries<>(); bars.setYAxisPosition(Position.BOTTOM); bars.addYField(access.data1()); bars.addColor(new RGB(148, 174, 10)); bars.setHighlighting(true); Chart<Data> chart = new Chart<>(); chart.setStore(store); // same ListStore your grid uses chart.addAxis(hits); chart.addAxis(months); chart.addSeries(bars); chart.setAnimated(true);
TextField name = new TextField();
name.setAllowBlank(false);
TextField email = new TextField();
email.setAllowBlank(false);
DateField start = new DateField();
start.addValidator(new MinDateValidator(new Date()));
TextArea notes = new TextArea();
notes.addValidator(new MinLengthValidator(10));
VerticalLayoutContainer form = new VerticalLayoutContainer();
form.add(new FieldLabel(name, "Name"), new VerticalLayoutData(1, -1));
form.add(new FieldLabel(email, "Email"), new VerticalLayoutData(1, -1));
form.add(new FieldLabel(start, "Start date"), new VerticalLayoutData(1, -1));
form.add(new FieldLabel(notes, "Notes"), new VerticalLayoutData(1, 100));
FramedPanel panel = new FramedPanel();
panel.setHeading("New contact");
panel.add(form);
panel.addButton(new TextButton("Save"));
BorderLayoutContainer shell = new BorderLayoutContainer(); BorderLayoutData westData = new BorderLayoutData(220); westData.setCollapsible(true); westData.setSplit(true); shell.setNorthWidget(toolBar, new BorderLayoutData(40)); shell.setWestWidget(navigationTree, westData); shell.setCenterWidget(grid, new MarginData()); shell.setSouthWidget(statusBar, new BorderLayoutData(28)); // Fill the browser window and resize with it Viewport viewport = new Viewport(); viewport.setWidget(shell); RootPanel.get().add(viewport);
TreeStore<FileNode> store = new TreeStore<>(props.key());
store.add(projects);
store.add(projects, Arrays.asList(src, docs, assets));
Tree<FileNode, String> tree = new Tree<>(store, props.name());
tree.setCheckable(true);
tree.setCheckStyle(CheckCascade.TRI); // parents reflect children
tree.setAutoLoad(true);
tree.getSelectionModel().addSelectionHandler(event ->
Info.display("Selected", event.getSelectedItem().getName()));
theme {
name = "mytheme"
basePackage = "com.example.theme.mytheme"
details {
buttonGroup {
borderRadius = 3
border = util.border('solid', '#dfeaf2', 3)
headerGradient = util.solidGradientString('#dfeaf2')
font = util.fontStyle("helvetica, arial, verdana", '13px', '#666666');
...
}
...
}
}






