Динамически создавать оператор печати в Java - PullRequest
0 голосов
/ 18 мая 2011

Я запрашиваю базу данных и получаю много информации, которая должна быть представлена ​​пользователю. В базе данных у меня есть поля a, b, c, d и e. Теперь пользователь должен иметь возможность указать, какие из этих полей должны быть напечатаны на экране (то есть пользователь может выбрать просмотр только подмножества данных, извлеченных из базы данных).

Как мне динамически создать оператор печати, который иногда печатает два поля, иногда четыре, иногда три и т. Д., В зависимости от того, что хочет пользователь?

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Естественным способом включения или выключения необязательного значения будет радиокнопка. Для 5 полей, то есть массива из 5 радиокнопок.

StringBuffer sb = new StringBuffer (5 * 10);
for (int i = 0; i < 5; ++i)
    if (rb[i])
        s.append (field[i]).append (" ");

Может быть, вам лучше выбирать только интересные столбцы из базы данных? Тогда полезна фиктивная колонка:

sql = new StringBuffer ("SELECT 1 "); // the dummy-column
for (int i = 0; i < 5; ++i)
    if (rb[i])
        sql.append (", ").append (fieldname[i]);
0 голосов
/ 18 мая 2011

Если вся тяжелая работа уже выполнена, и у вас просто есть набор результатов для печати, то это может быть просто последовательность вызовов System.out.print() для каждого результата, а затем завершить строку с \n. Он может быть вложен в цикл FOR, поэтому если у вас есть int с количеством полей для печати, просто итерируйте их.

В более сложном случае, когда у вас есть полный список, в котором некоторые поля выбраны, а другие нет, вы можете использовать (немного) грубый метод, подобный этому:

...

String[] chosenFields = {"Field 1", "Field 2" /*, (et cetera) */};

for (int i = 0; i < numberOfFields; i++)
{
    for (int j = 0; j < chosenFields.length; j++)
    {
        if (fieldsName[i].equals(chosenFields[j]))
            System.out.print(fields[i] + " ");

        break;
    }
}

System.out.println();

...

Извините за плохой отступ; не уверен, как отсортировать это здесь!

Если имена полей не определены во время выполнения и вы используете Java для выполнения запросов, рассмотрите возможность использования класса ResultSetMetaData для их получения.

EDIT:

В качестве примера, вот мой код, который получает все имена полей из таблицы, а затем создает флажок для каждого из них, который пользователь может выбрать или отменить выбор. Все вещи с графическим интерфейсом JFrame, которые я пропустил. Когда пользователь нажимает кнопку отправки, приложение проверяет каждый флажок и создает инструкцию SQL для удовлетворения запроса пользователей.

...

JCheckBox[] jcb;
ResultSetMetaData rsmd;

    private void makeCheckBoxes()
{
    initConnection(); // Establish connection to MySQL server

    try
    {
        Statement query = connection.createStatement();
        ResultSet rs = query.executeQuery("SELECT * FROM client_db;");
        rsmd = rs.getMetaData();

        noOfColumns = rsmd.getColumnCount();

        jcb = new JCheckBox[noOfColumns];

        for (int i = 0; i < noOfColumns; i++)
        {
            jcb[i] = new JCheckBox(rsmd.getColumnName(i + 1));
            jpCheckBoxes.add(jcb[i]);
            jcb[i].setEnabled(false);
            jcbComboBox.addItem(rsmd.getColumnName(i + 1));
        }

        jcb[0].setSelected(true);

        rs.close();
        query.close();

        connection.close();
    }
    catch (SQLException e)
    {
        System.err.println("!> Caught SQLException:\n" + e.getMessage());

        System.exit(1);
    }
}

...
if (e.getSource() == jbSubmit)
    {
        String query = "";

        initConnection();

        if (jtfSearch.getText().isEmpty() == true) // JTextField
        {
            jtaResults.setText(null); // JTextArea
            jtaResults.append("Please enter some search text in the text box above!\n");
            return;
        }
        else
        {
            int selectedFields;

            if (jrbAll.isSelected() == true) // JRadioButton
            {
                query = "SELECT *";

                selectedFields = -1;
            }
            else
            {
                query = "SELECT";
                selectedFields = 0;

                for (int i = 0; i < noOfColumns; i++)
                    if (jcb[i].isSelected() == true)
                    {
                        try
                        {
                            if (selectedFields > 0)
                                query += ",";

                            query += " " + rsmd.getColumnName(i + 1);
                        }
                        catch (SQLException err)
                        {
                            System.err.println("!> Caught SQLException:\n" + err.getMessage());

                            System.exit(1);
                        }

                        selectedFields++;
                    }
                }

            if (selectedFields == 0)
            {
                jtaResults.setText(null);
                jtaResults.append("No fields were selected!!\n");

                return;
            }
            else
            {
                query += " FROM client_db WHERE " + jcbComboBox.getSelectedItem() + " LIKE '%" + jtfSearch.getText() + "%'";

                if (jcbCurrentClients.isSelected() == true)
                    query += " AND currentClient LIKE 'y'";

                query += ";";
            }
        }

        System.out.println("Query = \"" + query + "\"");

        /* Now, print it out in the text area!! */

        try
        {
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            ResultSetMetaData rsMetaData = rs.getMetaData();

            int columnCount = rsMetaData.getColumnCount();
            jtaResults.append("--------------------------------\n");
            int noOfResults = 0;

            jtaResults.setText(null);

            while (rs.next() == true)
            {
                if (noOfResults > 0)
                    jtaResults.append("\n");

                jtaResults.append("* Search match " + (noOfResults + 1) + ":\n");

                for (int i = 0; i < columnCount; i++)
                {
                    jtaResults.append("-> " + rsMetaData.getColumnName(i + 1) + ": " +
                                            rs.getString(i + 1) + "\n");
                }

                noOfResults++;
            }

            if (noOfResults == 0)
            {
                jtaResults.append("No results were returned; please try again with more ambiguous search terms.\n\n");
            }

            //scroller.setScrollPosition(0, 1048576);

            rs.close();
            stmt.close();

            connection.close();
        }
        catch (SQLException err)
        {
            System.err.println("!> Caught SQLException:\n" + err.getMessage());

            System.exit(1);
        }
    }
}

Надеюсь, это поможет. Устойчивая конкатенация к query формирует допустимый оператор SQL на основе полей, выбранных пользователем. Надеюсь, вам помогут несколько модификаций, чтобы просто напечатать определенные поля. System.out.println() призыв к печати query примерно на две трети - это хорошее место для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...