sclass TableSearcher { JTable table; JTextField tfInput; JComponent searchPanel, panel; F2 rowTester; S input() { ret gtt(tfInput); } } static TableSearcher tableWithSearcher2(final JTable t) { final new TableSearcher s; s.table = t; s.tfInput = jtextfield(); s.rowTester = func(S pat, Map row) -> bool { anyValueContainsIgnoreCase(row, pat) }; onUpdate(s.tfInput, new Runnable { L lastFiltered, lastOriginal; public void run() { S pat = s.input(); L> data = rawTableData(t); if (eq(lastFiltered, data)) data = lastOriginal; print("Searching " + n(l(data), "entry")); new L data2; for (Map map : data) if (isTrue(callF(s.rowTester, pat, map))) data2.add(map); print("Found " + n(l(data2), "entry")); lastFiltered = data2; lastOriginal = data; dataToTable(t, data2); } }); s.searchPanel = withLabel("Search:", s.tfInput); s.panel = northAndCenter(s.searchPanel, t); ret s; }