sclass TableSearcher { JTable table; JTextField tfInput; JComponent 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(map, 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.panel = northAndCenter(withLabel("Search:", s.tfInput), t); ret s; }