4
\$\begingroup\$

This is my final project for my second Java class! I would like to get some feedback on it to see where and what I can improve.

There are five class files:

  1. GuiMusic

    This contains all all of the the Swing and AWT components and the key listeners.

  2. ScrollPaneSync

    Synchronizes the scroll bars on each JPanel.

  3. Stringbillder

    Manipulates result set data into a different form so that it can be set onto JTextFields.

  4. SqlCon

    Contains the connection and the methods for sending queries.

  5. UpdateQuery

    This is another data manipulation class used for insert and delete queries.


GuiMusic

I'm open to any critisim such that it's constructive but I have some specific questions

  • How would you split the class to make it smaller?

  • A lot of the ActionListeners have very similiar functionality, is it better to reuse them with different sources and expand the class or should everything have its own listener?

    I avoided some code repetition but I'm not sure that that's a good thing when you it might slow your program down.

  • Could generics improve the flexibility of my code?

package guiMusic;


public class GuiMusic extends JFrame 
{

    private static final long serialVersionUID = 1L;
    /**
     * @conn
     * object represents the connection to the database
     */
    SqlCon conn;
    /**
     * @stmt
     * used by conn to process sql query results
     */
    Statement stmt;
    ResultSet rs;
    /**
     * @sb
     * StringBuilder used to manipulate query data
     */
    StringBillder sb;
    /**
     * @formatedData
     * used to store information from textAreas and pass to conn
     */
    StringBuilder[] formatedData;
    /**
     * @addInfo
     * after a query from the add tab things are the information is stored in addinfo
     */
    String[] addInfo;
    /**
     * @sync
     * class that synchronizes scrollbars together
     */
    ScrollPaneSync sync;
    /**
     * @query
     * pretty self explanatory 
     */
    String query;

    /**
     * @search
     * @searchBar
     * @searchLabel
     * @searchText
     * majority of the objects needed for 
     * the creation of the search panel
     */
    JPanel search;
    JTextField searchBar;
    JTextField[] searchLabel = new JTextField[4];
    JTextArea[] searchText = new JTextArea[4];


    Font tmu = new Font("Tibetan Machine Uni",1, 20);
    Font tmus = new Font("Tibetan Machine Uni",1,15);
    String[] labelQueries= {
            "select * from info where %s like '%%%s%%'",
            "select * from info where %s like '%%%s%%' && %s like '%%%s%%'",
            "select * from info where %s like '%%%s%%' && %s like '%%%s%%' && %s like '%%%s%%'",
            "select * from info where %s like '%%%s%%' && %s like '%%%s%%' && %s like '%%%s%%' && %s like '%%%s%%'"};

    /**
     * @add
     * @addSubmit
     * @addClear
     * @addSearch
     * @addLabel
     * @addText
     * majority of objects needed for 
     * the creation of add panel
     */
    JPanel add;
    JButton addSubmit;
    JButton addClear;
    JTextField addSearch;
    JTextField[] addLabel = new JTextField[3];
    JTextArea[] addText = new JTextArea[3];
    /**
     * @remove
     * @remSubmit
     * @remClear
     * @remSearch
     * @remLabel
     * @remText
     * components needed for creation of 
     * the  remove tab
     */
    JPanel remove;
    JButton remSubmit;
    JButton remClear;
    JTextField remSearch;
    JTextField[] remLabel = new JTextField[4];
    JTextArea[] remText = new JTextArea[4];
    /**
     * @labelValues
     * used throughout program to make associations
     * and assign values
     * 
     */
    public final String[] LABELVALUES = {"artist" ,"album" ,"song", "genre"};


    GuiMusic() throws ClassNotFoundException, SQLException
    {
        formatedData = new StringBuilder[4];

        for(int i = 0; i<4; i++)
        {
            formatedData[i] = new StringBuilder();
        }

        addInfo = new String[4];
        conn = new SqlCon();
        sb = new StringBillder();

        setBounds(200, 100, 1500, 900);
        JTabbedPane main = new JTabbedPane();
        add(main);
        main.setFont(tmu);

        main.addTab("<html><body marginwidth=200 marginheight=10>Search</body></html>", createSearch());
        main.addTab("<html><body marginwidth=200 marginheight=10>Add</body></html>", createAdd());
        main.addTab("<html><body marginwidth=200 marginheight=10>Remove</body></html>", createRemove());
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        addWindowListener(new WindowListener(){
            @Override
            public void windowActivated(WindowEvent e) {}
            @Override
            public void windowClosed(WindowEvent e) {}
            @Override
            public void windowClosing(WindowEvent e) 
            {
                try
                {
                    conn.clothes();
                } catch (SQLException e1) {e1.printStackTrace();}
            }
            @Override
            public void windowDeactivated(WindowEvent e) {}
            @Override
            public void windowDeiconified(WindowEvent e) {}
            @Override
            public void windowIconified(WindowEvent e) {}
            @Override
            public void windowOpened(WindowEvent e) {}
        }); 
    }

    private JPanel createSearch() 
    {
        search = new JPanel();  
        searchBar = new JTextField("search");
        searchBar.setHorizontalAlignment(SwingConstants.CENTER);
        searchBar.setPreferredSize(new Dimension(1300,60));
        searchBar.setFont(tmu); 
        searchBar.setName("searchBar");
        searchBar.addKeyListener(new SearchBarListener());
        search.add(searchBar);
        JScrollPane[] scroll = new JScrollPane[4];

        for(int i = 0; i<4; i++)
        {
            searchLabel[i] = new JTextField(LABELVALUES[i], SwingConstants.CENTER);
            searchLabel[i].setFont(tmu);
            searchLabel[i].setName(LABELVALUES[i]);
            searchLabel[i].addKeyListener( new textFieldListener());
            searchLabel[i].setHorizontalAlignment(SwingConstants.CENTER);
            searchLabel[i].setPreferredSize(new Dimension(325,60));
            searchText[i] = new JTextArea();
            searchText[i].setFont(tmus);            
        }

        for(JTextField el : searchLabel)
        {
            search.add(el);
        }

        for(int i = 0; i<4; i++)
        {
            scroll[i] = new JScrollPane(searchText[i]);
            scroll[i].setVerticalScrollBar(new JScrollBar());
            scroll[i].setPreferredSize(new Dimension(325,600));
            search.add(scroll[i]);  
        }
        sync = new ScrollPaneSync(scroll);
        for(int i = 0; i<scroll.length; i++)
        {
            scroll[i].getVerticalScrollBar().addAdjustmentListener(sync);
        }
        return search;      
    }

    private JPanel createAdd()
    {
        add = new JPanel();
        add.setLayout(new FlowLayout());
        addClear = new JButton(("Clear"));
        addClear.setFont(tmu);
        addClear.setPreferredSize(new Dimension(220,60));
        addClear.setName("addClear");
        addClear.addActionListener(new buttonListener());

        addSubmit = new JButton(("Submit"));
        addSubmit.setFont(tmu);
        addSubmit.setPreferredSize(new Dimension(220,60));
        addSubmit.setName("addSubmit");
        addSubmit.addActionListener(new buttonListener());

        addSearch = new JTextField("Artist");
        addSearch.setFont(tmu);
        addSearch.setPreferredSize(new Dimension(1000,60));
        addSearch.setHorizontalAlignment(SwingConstants.CENTER);
        addSearch.setName("addSearch");
        addSearch.addKeyListener(new addSearchListener());

        add.add(addSubmit);
        add.add(addSearch);
        add.add(addClear);
        JScrollPane[] addScroll = new JScrollPane[3];

        for(int i = 0; i<3; i++)
        {
            addLabel[i] = new JTextField(LABELVALUES[i+1]);
            addLabel[i].setHorizontalAlignment(SwingConstants.CENTER);
            addLabel[i].setPreferredSize(new Dimension(450,100));
            addLabel[i].setFont(tmu);
            addLabel[i].setName(LABELVALUES[i+1]);
            addLabel[i].addKeyListener(new addFieldListener());
            add.add(addLabel[i]);
            addText[i] = new JTextArea();
            addText[i].setFont(tmus);
        }

        for(int i = 0; i<3; i++)
        {
            addScroll[i] = new JScrollPane(addText[i]);
            addScroll[i].setVerticalScrollBar(new JScrollBar());
            addScroll[i].setPreferredSize(new Dimension(450,500));
            add.add(addScroll[i]);  
        }

        sync = new ScrollPaneSync(addScroll);

        for(int i = 0; i<addScroll.length; i++)
        {   
            addScroll[i].getVerticalScrollBar().addAdjustmentListener(sync);
        }
        return add;     
    }

    private JPanel createRemove()
    {
        remove = new JPanel();
        remSubmit = new JButton("Remove");
        remSubmit.setFont(tmu);
        remSubmit.setPreferredSize(new Dimension(220,60));
        remSubmit.addActionListener(new buttonListener());

        remSearch = new JTextField("Search Term",SwingConstants.CENTER);
        remSearch.setHorizontalAlignment(SwingConstants.CENTER);
        remSearch.setPreferredSize(new Dimension(1000,60));
        remSearch.setFont(tmu);
        remSearch.setName("remSearch");
        remSearch.addKeyListener(new remBarListener());

        remClear = new JButton("Clear");
        remClear.setFont(tmu);
        remClear.setPreferredSize(new Dimension(220,60));
        remClear.addActionListener(new buttonListener());

        remove.add(remSubmit);
        remove.add(remSearch);
        remove.add(remClear);
        JScrollPane[] remScroll = new JScrollPane[4];

        for(int i =0; i<4; i++)
        {
            remLabel[i] = new JTextField(LABELVALUES[i]);
            remLabel[i].setHorizontalAlignment(SwingConstants.CENTER);
            remLabel[i].setPreferredSize(new Dimension(325,100));
            remLabel[i].setName(LABELVALUES[i]);
            remLabel[i].setFont(tmu);
            remLabel[i].addKeyListener(new textFieldListener());
            remove.add(remLabel[i]);

            remText[i]= new JTextArea();
            remText[i].setFont(tmus);

            remScroll[i] = new JScrollPane(remText[i]);
            remScroll[i].setPreferredSize(new Dimension(325,600));  
        }
        for(int i = 0; i<4; i++)
        {
            remove.add(remScroll[i]);
        }

        sync = new ScrollPaneSync(remScroll);
        for(int i = 0; i<remScroll.length; i++)
        {
            remScroll[i].getVerticalScrollBar().addAdjustmentListener(sync);
        }
        return remove;
    }

    public static void main(String[] args) throws ClassNotFoundException, SQLException
    {

        for(int i = 0; i<10; i++)
        {
            System.out.println("indie");
        }
        System.out.println();
        for(int i = 0; i<10; i++)
        {
            System.out.println("XO");
        }
        new GuiMusic().setVisible(true);        
    }

    public class SearchBarListener implements KeyListener
    {
        @Override
        public void keyPressed(KeyEvent e) {}
        @Override
        public void keyReleased(KeyEvent e)
        {
            query = searchBar.getText();    
            query = String.format("select * from info where album like '%%%s%%' || artist like '%%%s%%' || song like '%%%s%%'|| genre like '%%%s%%'",query,query,query,query);
            try
            {

                rs = conn.sqlQuery(query);

                for(int i = 0; i<4; i++)
                {
                    formatedData[i].setLength(0);
                }
                formatedData = sb.formatData(rs);

            } catch (SQLException ef) {ef.printStackTrace();}
                searchText[0].setText(formatedData[0].toString());
                searchText[1].setText(formatedData[1].toString());
                searchText[2].setText(formatedData[2].toString());
                searchText[3].setText(formatedData[3].toString());
        }
        @Override
        public void keyTyped(KeyEvent e) {}
    }

    public class remBarListener implements KeyListener
    {
        @Override
        public void keyPressed(KeyEvent e) {}

        @Override
        public void keyReleased(KeyEvent e)
        {   
            query = remSearch.getText();            
            query = String.format("select * from info where album like '%%%s%%' || artist like '%%%s%%' || song like '%%%s%%'|| genre like '%%%s%%'",query,query,query,query);

            try
            {
                rs = conn.sqlQuery(query);      
                for(int i = 0; i<4; i++)
                {
                    formatedData[i].setLength(0);
                }
                formatedData = sb.formatData(rs);

            } catch (SQLException ef) {ef.printStackTrace();}

                remText[0].setText(formatedData[0].toString());
                remText[1].setText(formatedData[1].toString());
                remText[2].setText(formatedData[2].toString());
                remText[3].setText(formatedData[3].toString());
        }
        @Override
        public void keyTyped(KeyEvent e) {}
    }

    public class textFieldListener implements KeyListener
    {

        String queryLocation;
        boolean[] validTextonLabel = new boolean[4];
        String getText;
        int numberOfTrue = 0;
        ArrayList<Integer> trueIndex = new ArrayList<>();
        boolean search = false;
        boolean remove = false;



        @Override
        public void keyPressed(KeyEvent e) {}
        @Override
        public void keyReleased(KeyEvent e)
        {   
            for(int i = 0; i<4; i++)
            {
                if(e.getSource().equals(remLabel[i]) || e.getSource().equals(remSearch))
                {   
                    remove = !remove;
                    System.out.println("work");
                }
                else if(e.getSource().equals(searchLabel[i]))
                    search = !search;
            }

            for(int q = 0; q <4; q++)
            {
                if(search)
                {
                    getText = searchLabel[q].getText();
                }
                else if(remove)
                {
                    getText = remLabel[q].getText();
                }

                if(!(getText.equals(null)) && !(getText.equals(LABELVALUES[q])) && !(getText.equals("")) && !(getText.equals(" ")))
                {
                    validTextonLabel[q] = true;
                    addInfo[q] = getText;
                    trueIndex.add(q);
                    numberOfTrue++;
                }
            }       

            if(numberOfTrue == 4)
            {
                query = String.format(labelQueries[3],LABELVALUES[0],addInfo[0],LABELVALUES[1],addInfo[1],LABELVALUES[2],addInfo[2],LABELVALUES[3],addInfo[3]);
            }
            else if(numberOfTrue == 3 )
            {
                query = String.format(labelQueries[2],LABELVALUES[trueIndex.get(0)],addInfo[trueIndex.get(0)],LABELVALUES[trueIndex.get(1)],addInfo[trueIndex.get(1)],LABELVALUES[trueIndex.get(2)],addInfo[trueIndex.get(2)]);
            }
            else if(numberOfTrue == 2)
            {
                query = String.format(labelQueries[1], LABELVALUES[trueIndex.get(0)],addInfo[trueIndex.get(0)],LABELVALUES[trueIndex.get(1)],addInfo[trueIndex.get(1)]);    
            }
            else if(numberOfTrue == 1)
            {
                query = String.format(labelQueries[0], LABELVALUES[trueIndex.get(0)],addInfo[trueIndex.get(0)]);
            }
            else if(e.getSource().equals(remSearch))
            {
                System.out.println("true");
            }
            else
                System.out.println("false");
            System.out.println(query);
            try 
            {
                rs = conn.sqlQuery(query);

                for(int i = 0; i<4; i++)
                {
                    formatedData[i].setLength(0);
                }
                formatedData = sb.formatData(rs);

            } catch (SQLException ef) {ef.printStackTrace();}

            if(search)
            {
                searchText[0].setText(formatedData[0].toString());
                searchText[1].setText(formatedData[1].toString());
                searchText[2].setText(formatedData[2].toString());
                searchText[3].setText(formatedData[3].toString());
            }
            else if(remove);
            {
                remText[0].setText(formatedData[0].toString());
                remText[1].setText(formatedData[1].toString());
                remText[2].setText(formatedData[2].toString());
                remText[3].setText(formatedData[3].toString());
            }

            trueIndex.clear();
            numberOfTrue = 0;
            for(int i = 0; i<4; i++)
            {
                validTextonLabel[i] = false;
            }
            search = false;
            remove = false; 
        }
        @Override
        public void keyTyped(KeyEvent e) {}
    }

    public class addFieldListener implements KeyListener
    {

        String queryLocation;

        @Override
        public void keyPressed(KeyEvent e) {}
        @Override
        public void keyReleased(KeyEvent e)
        {
            queryLocation =  e.getComponent().getName();
            for(int i = 0; i<3; i++)
            {
                if(queryLocation.equals(LABELVALUES[i+1]))
                {
                    query = String.format("select * from info where %s like '%%%s%%'",LABELVALUES[i+1],addLabel[i].getText());
                }
            }

            try 
            {
                rs = conn.sqlQuery(query);

                for(int i = 0; i<4; i++)
                {
                    formatedData[i].setLength(0);
                }
                formatedData = sb.formatData(rs);

            } catch (SQLException ef) {ef.printStackTrace();}

            addText[0].setText(formatedData[1].toString());
            addText[1].setText(formatedData[2].toString());
            addText[2].setText(formatedData[3].toString());

        }

        @Override
        public void keyTyped(KeyEvent e) {}
    }

    public class addSearchListener implements KeyListener
    {

        @Override
        public void keyPressed(KeyEvent e) {}
        @Override
        public void keyReleased(KeyEvent e)
        {
            query = addSearch.getText();
            query = String.format("select * from info where album like '%%%s%%' || artist like '%%%s%%' || song like '%%%s%%'|| genre like '%%%s%%'",query,query,query,query);

            try {
                rs = conn.sqlQuery(query);

                for(int i = 0; i<4; i++)
                {
                    formatedData[i].setLength(0);
                }
                formatedData = sb.formatData(rs);

            } catch (SQLException ef) {ef.printStackTrace();}

            addText[0].setText(formatedData[1].toString());
            addText[1].setText(formatedData[2].toString());
            addText[2].setText(formatedData[3].toString());


        }
        @Override
        public void keyTyped(KeyEvent e) {}
    }

    public class buttonListener implements ActionListener
    {
        String[][] addReturn;
        UpdateQuery uq;
        @Override
        public void actionPerformed(ActionEvent ae) 
        {
            if(ae.getSource().equals(addClear))
            {
                addSearch.setText("");
                for(int i = 0; i<3; i++)
                {
                    addText[i].setText("");
                }
            }
            else if(ae.getSource().equals(remClear))
            {
                remSearch.setText("");
                for(int i = 0; i<4; i++)
                {
                    remText[i].setText("");
                }
            }
            else if(ae.getSource().equals(addSubmit))
            {
                addInfo[0] = addSearch.getText();
                for(int i = 1; i<4; i++)
                {
                    addInfo[i] = addText[i-1].getText();
                }

                uq = new UpdateQuery();
                addReturn = uq.sqlUpdate(addInfo);

                for(int i = 0; i< addReturn[1].length; i++)
                {
                    query = String.format("insert into info values('%s','%s','%s','%s')", addReturn[0][0],addReturn[1][i],addReturn[2][i],addReturn[3][i]);

                    try 
                    {
                        conn.executeUpdate(query);
                    } catch (SQLException ef) {ef.printStackTrace();}
                }
            }
            else if(ae.getSource().equals(remSubmit))
            {       
                for(int i = 0; i<4; i++)
                {
                    addInfo[i] = remText[i].getText();
                }

                uq = new UpdateQuery();
                addReturn = uq.sqlUpdate(addInfo);

                for(int i = 0; i< addReturn[1].length; i++)
                {
                    query = String.format("delete from info where song = '%s'",addReturn[2][i]);

                    try 
                    {   
                        conn.executeUpdate(query);  
                    } catch (SQLException ef) {ef.printStackTrace();}
                }
            }
        }
    }
}

ScrollPaneSync

  • Readability?
package guiMusic;



public class ScrollPaneSync implements AdjustmentListener
{

    JScrollBar[] bars;
    ScrollPaneSync(JScrollPane...scrolls)
    {
        bars = new JScrollBar[scrolls.length];
        int count = 0;

        for(int i = 0; i<scrolls.length; i++)
        {
            bars[count] = scrolls[i].getVerticalScrollBar();
            count++;
        }
    }
    @Override
    public void adjustmentValueChanged(AdjustmentEvent e)
    {
         JScrollBar scrollBar = (JScrollBar)e.getSource();  
        for(int i = 0; i< bars.length; i++)
        {
            bars[i].setValue(scrollBar.getValue());
        }

    }

    }

StringBillder

    class StringBillder {
    private StringBuilder[] theReturn;
    private ArrayList<String> artVals;
    private ArrayList<String> albVals;
    private ArrayList<String> traVals;
    private ArrayList<String> genVals;
    StringBillder()
    {
        theReturn = new StringBuilder[4];

        for(int i = 0; i< theReturn.length;i++)
        {
            theReturn[i] = new StringBuilder();
        }

        artVals = new ArrayList<>();
        albVals = new ArrayList<>();
        traVals = new ArrayList<>();
        genVals = new ArrayList<>();
    }

    public StringBuilder[] formatData(ResultSet rs) 
    {
        artVals.clear();
        albVals.clear();
        traVals.clear();
        genVals.clear();

        try 
        {
            while(rs.next())
            {
                artVals.add(rs.getString(1));
                albVals.add(rs.getString(2));
                traVals.add(rs.getString(3));
                genVals.add(rs.getString(4));
            }
        } catch (SQLException e) {e.printStackTrace();}

        for(String el : artVals)
        {
            theReturn[0].append(el).append("\n");   
        }

        for(String el: albVals)
        {
            theReturn[1].append(el).append("\n");
        }

        for(String el : traVals)
        {
            theReturn[2].append(el).append("\n");
        }

        for(String el : genVals)
        {
            theReturn[3].append(el).append("\n");
        }

        return theReturn;
    }
}

SqlCon

public class SqlCon {

    private static final String dbClassName = "com.mysql.jdbc.Driver";
    private static final String CONNECTION = "jdbc:mysql://this.is.a.ip/music";
    Connection con;
    Statement stmt = null;
    ResultSet rs;
    SqlCon() throws ClassNotFoundException, SQLException
    {
         Class.forName(dbClassName);
         Properties p = new Properties();
         p.put("user", "foo");
         p.put("password", "bar"); 
         con = DriverManager.getConnection(CONNECTION,p);


    }
    public void executeUpdate(String query) throws SQLException
    {
        stmt = con.createStatement();
        stmt.executeUpdate(query);
    }

    public ResultSet sqlQuery(final String query) throws SQLException
    {
        stmt = con.createStatement();
        rs = stmt.executeQuery(query);
        return rs;  
    }
    public void clothes() throws SQLException
    {
        if(con != null )
            con.close();
        if(stmt != null)
            stmt.close();
        if(rs != null)
            rs.close();
    }

}

UpdateQuery

public class UpdateQuery 
{


    String[][] formattedReturn;
    String[] queriedInfo;

    UpdateQuery()
    {   
        queriedInfo = new String[4];
        formattedReturn = new String[4][];
    }

    public String[][] sqlUpdate(String[] arg)
    {
        queriedInfo = arg;

        for(int column = 0; column<4;column++)
        {
            formattedReturn[column] = queriedInfo[column].split("\\n");
        }



        return formattedReturn;

    }
}
\$\endgroup\$
3
  • \$\begingroup\$ I often tell people to not name variables like i,j,k .... but if i see a JTextField-Variable having the name addLabel, i think i,j,k would be a better start. Finally i decide not to answer because it would be Sisyphean labor. \$\endgroup\$
    – Grim
    Commented Aug 4, 2015 at 18:17
  • 1
    \$\begingroup\$ Is the misspelling StringBillder intentional so that it doesn't conflict with that of StringBuilder? I think you need a much better class name here... \$\endgroup\$
    – h.j.k.
    Commented Aug 5, 2015 at 0:34
  • \$\begingroup\$ yes it is intentional, yeah it could be more descriptive. \$\endgroup\$ Commented Aug 5, 2015 at 6:33

1 Answer 1

2
\$\begingroup\$

Code duplication

You have a lot of similar code blocks that set the following properties:

addClear.setFont(tmu);
addClear.setPreferredSize(new Dimension(220,60));
addClear.setName("addClear");

You can consider extracting these out to a method that you can reuse:

private static <T extends JComponent> T setup(T component, String name, Font font, 
                                            int preferredWidth, int preferredHeight) {
    component.setName(name);
    component.setFont(font);
    component.setPreferredSize(new Dimension(preferredWidth, preferredHeight));
    return component;
}

The idea of return-ing the component is to let you daisy-chain this method with calling other properties of the component itself, e.g.

// note: capital 'B' for ButtonListener
setup(addClear, "addClear", tmu, 220, 60).addActionListener(new ButtonListener());

Collections vs arrays, and iterating through them

You seem to rely a lot on plain arrays... but I think one should tend towards the Collection classes as they are more descriptive in what their identity, e.g. a Set tells you that elements are distinct, and a List implies an ordering. Regardless of which you choose, you can already use the enhanced for-each loop (since Java 1.5) instead of the index-based for-loop, especially since you do not use the index:

for (JTextField textField : searchLabel) {
    // ...
}

edit: ah, so you did use these in your poorly-named StringBillder, but I'm not too sure how that is being used in the first place, and whether it is appropriate. For starters, you should declare your variables as List<T> list = new ArrayList<>(), instead of ArrayList<T> list = .... This is because users of the list instance only needs to understand they are dealing with the List interface.

Bracing style

The good news here is that your bracing style, while non-Java-conventional, is largely consistent. The only two exceptions I see are for your catch statements in try-catch blocks and the final else/else if clauses, so you may wish to improve on that.

Oh, and hang on for a moment, inside textFieldListener.keyReleased(KeyEvent)...

    else if(remove);
    {
        remText[0].setText(formatedData[0].toString());
        remText[1].setText(formatedData[1].toString());
        remText[2].setText(formatedData[2].toString());
        remText[3].setText(formatedData[3].toString());
    }

There is a bug here, I'll let you figure it out ;).

Names

Your *Listener implementations should be using PascalCase for the class name too. Your arrays are better off in the plural forms, as it reads (or sounds) better that you are iterating through searchLabels than (a) searchLabel.

Is the misspelling StringBillder intentional so that it doesn't conflict with that of StringBuilder? I think you need a much better class name here... - myself

And yeah, this earlier comment applies too.

SQL and prepared statements

Initially, I was wondering why does your query template/patterns have so many %-s in them, before I realized they are used for String.format(String, Object...) as placeholders and to escape the literal % character.

The thing is, prepared statements for SQL queries are the way to go, and we don't mean literally preparing them using String.format(). I'll suggest reading the documentation here for more information on this topic. :)

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.