¿Dónde debo colocar el detector de eventos?

Y X :

Hice muchos de los objetos tales como JButton, JLabel, JCheckBox, etc, y he añadido un detector de eventos al objeto. Me gusta esto. objeto obj = new obj (); obj.listneraddActionListener () {}; Sin embargo, si oyente utiliza otros objetos, que los objetos deben crearse antes de código oyente. Estoy pensando en si debería ordenar definición de objeto por adelantado o tirar de todos los oyentes a continuación. ¿Qué debo hacer para esto?

Editar :: Lo siento, no he puesto porque el código era demasiado grande. el siguiente es parte del código. Tengo mensaje de error desde casillas de verificación (chkName, chkAddress, chkType, chkComment)

    JButton btnSearch = new JButton("");
    btnSearch.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {             
            String str = "";
            ResultSet rsSid, rsNM = null;
            int count = 0;

            if (chkName.isSelected()) {str += "(SELECT " + tableName + "_SID FROM " + tableName + " WHERE " + tableName + "_NM LIKE '%" + txtSearch.getText() + "%') UNION "; ++count;}
            if (chkAddress.isSelected()) {str += "(SELECT " + tableName + "_SID FROM " + tableName + " WHERE " + "ADDR LIKE '%" + txtSearch.getText() +"%') UNION "; ++count;}
            if (chkType.isSelected()) {str += "(SELECT " + tableName + "_SID FROM " + tableName + " WHERE " + "TYPE LIKE '%" + txtSearch.getText() +"%') UNION "; ++count;}
            if (chkComment.isSelected()) {str += "(SELECT " + tableName + "_SID FROM " + tableName + " WHERE " + "COMMENT LIKE '%" + txtSearch.getText() +"%') UNION "; ++count;}
            if (count == 0) return;

            if (txtSearch.getText() != "")
                str = str.substring(0, str.length() - 7) + ';';
            else
                str = "SELECT * FROM " + tableName;

            rsSid = jdbc.executeQuery(conn, str);
            try {
                behindList.clear();
                lstSRmodel.clear();
                TableSummary temp = new TableSummary();
                while(rsSid.next()) {
                    for (int i = 1; i <= rsSid.getMetaData().getColumnCount(); ++i) {
                        temp.TABLE_SID = rsSid.getInt(i);
                        rsNM = jdbc.executeQuery(conn, "SELECT " + tableName + "_NM FROM " + tableName + " WHERE " + tableName + "_SID = " + temp.TABLE_SID + ";");
                        if (rsNM.next()) {
                            temp.TABLE_NM = rsNM.getString(1);
                            behindList.add(new TableSummary(temp.TABLE_SID, temp.TABLE_NM));
                            lstSRmodel.addElement(temp.TABLE_NM);
                        }
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    });

    JCheckBox chkAll = new JCheckBox("\uC804\uCCB4");

    chkAll.setBounds(14, 75, 131, 27);
    contentPane.add(chkAll);

    JCheckBox chkName = new JCheckBox("\uC774\uB984");
    chkName.setBounds(14, 106, 131, 27);
    contentPane.add(chkName);

    JCheckBox chkAddress = new JCheckBox("\uC704\uCE58");
    chkAddress.setBounds(14, 137, 131, 27);
    contentPane.add(chkAddress);

    JCheckBox chkType = new JCheckBox("\uD0C0\uC785");
    chkType.setBounds(14, 168, 131, 27);
    contentPane.add(chkType);

    JCheckBox chkComment = new JCheckBox("\uC138\uBD80\uC0AC\uD56D");
    chkComment.setBounds(14, 199, 131, 27);
    contentPane.add(chkComment);
Datos no encontrados :

Usted debe dividir su ActionListenery su código de negocio: su no deberían ejecutar una consulta de larga duración en una ActionListenercausa que congelaría su aplicación mediante el bloqueo de la EDT (Evento de Despacho de rosca).

Haría preferentemente la siguiente cuando se trata de oscilación (u otro marco como Java FX, SWT, ...):

  • Crear GUI componentes tales como el campo, ...
  • Configurar o "init" el diseño, que es añadir el componente a sus padres y así sucesivamente
  • Configurar cualquier detector de eventos

Eso sería (reemplace "init" por "configurar" si lo prefiere):

private JCheckBox checkBox;

MyClass() { // constructor
  this.init();
}

void init() {
  initComponents();
  initEventListeners();
}

void initComponents() {
  this.checkBox = new JCheckBox("..."); // or in the constructor if you want final field.

  // layout for the parent component 
  this.add(new JLabel("Label 1"));
  this.add(checkBox);
}

void initEventListeners() {
  this.checkBox.addActionListener(System.out::println);
}

Además, el evento se adjunta a un componente Swing debe mantenerse tan simple como sea posible si son anónimos o lambda clases: en su lugar, crear un método privado y utilizar su referencia:

  btnSearch.addActionListener(this::searchActionListener);

Y el método en el que utilizo otro hilo ( ForkJoinPool.commonPool()) para ejecutar el trabajo de larga duración fuera de la EDT (Evento de Despacho de rosca). De lo contrario, la interfaz se congelaría. El método de negocio se realiza fuera, en otro objeto (llamado businessaquí).

El botón de búsqueda debe ser desactivado, de lo contrario el usuario (en este caso) podría spam en el botón que lleva a problemas no deseados en la base de datos ...

private void searchActionListener(ActionEvent event) {
    btnSearch.setEnabled(false);  // user should not be able to search while it's running

    // extract Swing data before running outside the EDT
    String query = txtSearch.getText()
    boolean useName = chkName.isSelected();
    boolean useAddress = chkAddress.isSelected();
    // ... and so on

    // do work OUTSIDE the EDT
    ForkJoinPool.commonPool().execute(() -> {
      Result result = business.find(query, useName, useAddress);
      SwingUtilities.invokeLater(() -> {
        processResult(result); // do whatever is needed
        btnSearch.setEnabled(true);
      });
    });
  }

Como se puede ver, si ha creado su componente Swing ( chkName...) antes de que el detector de eventos, es posible que no hacer referencia a ellos en el método: se debe crear como campo para la clase y no como variables .

De lo contrario, usted está obligado a crearlos antes de que el detector de eventos.

Asimismo, si bien no se discute en la pregunta, usted debe volver a escribir la consulta debido a que su están inyectando SQL:

"(SELECT " + tableName + "_SID FROM " + tableName + " WHERE " + tableName + "_NM LIKE '%" + txtSearch.getText() + "%') UNION ";

La '%" + txtSearch.getText() + "%'proceder a la sustitución ?y se debe utilizar un PreparedStatement para pasar parámetro en lugar de inyectarlo.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=232877&siteId=1
Recomendado
Clasificación