Hi!

Please, explain me why JTextField: txtFirstName and JTextField: txtLastName are not visible on my JPanel: panfortab?! I can see only JTable: tableDetails.

private void createBaseRight() {
        JPanel panfortab = new JPanel();
        panfortab.setBounds(330, 150, 650, 795);
        panfortab.setVisible(true);
        panfortab.setOpaque(true);
        panfortab.setBorder(bord);
        FilterClass fc = new FilterClass();
        fc.setVisible(true);
        panfortab.add(fc);
        pan.add(panfortab, "Right"); // this is a general panel that includes all components that I've created. Now it has BorderLayout.
}
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableRowSorter;

public class FilterClass extends JPanel {
    TableRowSorter rowSorter;
    private DefaultTableModel tableModel;

    public FilterClass() {
        setLayout(new BorderLayout());
        initComponents();
        rowSorter=new TableRowSorter();
        tableModel = (DefaultTableModel) tableDetails.getModel();
        rowSorter.setModel(tableModel);
        tableDetails.setRowSorter(rowSorter);
    }

    private void initComponents() {

        tableDetails = new javax.swing.JTable();
        txtFirstName = new javax.swing.JTextField();
        txtLastName = new javax.swing.JTextField();

        tableDetails.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"103", "AAA","BBB","Senior programmer", "Male","09.08.1980"},
                {"104", "CCC","DDD","Project manager", "Male","27.03.1979"}
            },
            new String [] {"Reg.num.",
                          "Name",
                          "Surename",
                          "Profession",
                          "Sex",
                          "Date of birth"}
        ));

        // Set column widths
        tableDetails.setFillsViewportHeight(true);
        tableDetails.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        TableColumn col;
        int width = 100;
        col = tableDetails.getColumnModel().getColumn(3);
        col.setPreferredWidth(width);
        col = tableDetails.getColumnModel().getColumn(5);
        col.setPreferredWidth(width);
        jScrollPane1 = new javax.swing.JScrollPane(tableDetails, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        add(jScrollPane1, "North");

        txtFirstName.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txFirstNameKeyReleased(evt);
            }
        });

        txtLastName.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txtLastNameKeyReleased(evt);
            }
        });
    }

    private void txFirstNameKeyReleased(java.awt.event.KeyEvent evt) {
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)^"+txtFirstName.getText(), 0));
    }

    private void txtLastNameKeyReleased(java.awt.event.KeyEvent evt) {
        rowSorter.setRowFilter(RowFilter.regexFilter("(?i)^" +txtLastName.getText(), 1));
    }

    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tableDetails;
    private javax.swing.JTextField txtFirstName;
    private javax.swing.JTextField txtLastName;
}

Dani AI

Generated

Short answer: the text fields were created but never added to the FilterClass panel, so Swing never laid them out or painted them. spotted that, and fixed the symptom by switching to GridBagLayout. For clarity: when a component is constructed but not added to a visible container it will remain invisible, and using the wrong layout region or absolute bounds can make added components effectively invisible too.

A simple, reliable pattern is to put filter controls into a small subpanel and let the table's scroll pane fill the main area. For example:

JPanel filterPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
filterPanel.add(firstFilterField);
filterPanel.add(lastFilterField);
add(filterPanel, BorderLayout.NORTH);
add(tableScrollPane, BorderLayout.CENTER);

If both fields should filter the table at once, avoid calling setRowFilter twice (later calls replace earlier filters). Combine filters instead:

List<RowFilter<Object,Object>> fl = new ArrayList<>();
fl.add(RowFilter.regexFilter("(?i)"+firstFilterField.getText(), firstNameColIndex));
fl.add(RowFilter.regexFilter("(?i)"+lastFilterField.getText(), lastNameColIndex));
sorter.setRowFilter(RowFilter.andFilter(fl));

Quick debugging / best-practice checklist:

  • Verify you called container.add(component, constraint) for each component.
  • If you change components after the GUI is visible, call revalidate() then repaint().
  • Don’t mix setBounds() (absolute layout) with layout managers; prefer layout managers.
  • Use BorderLayout.EAST/NORTH constants, not arbitrary strings like "Right".
  • Build the UI on the Event Dispatch Thread (SwingUtilities.invokeLater) and use pack() or setPreferredSize() so components get sensible sizes.
  • Temporarily set distinct background colors to panels to see where each region is laid out.

Following those checks will make the text fields reliably visible and let you control where the table and filter controls appear.

Recommended Answers

All 2 Replies

I can't see where you add those fields to anything.

Yeah, thanks. I've fixed it. Now I'm using GridBaglayout and everything works more or less fine.

I can't see where you add those fields to anything.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.