Переменная не найдена, хотя она в классе выше - PullRequest
0 голосов
/ 07 мая 2018

Итак, у меня есть класс GUI, который содержит JButtons, а затем у меня есть класс actionPerformed, который показывает, что произойдет, если я нажму кнопку. Теперь, когда я делаю if(e.getSource()==search), поиск появляется красным и говорит, что переменная не может быть найдена в графическом интерфейсе класса. Хотя это в том же классе.

Мне нужна помощь с этим.

package crimedata;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;


class GUI extends JFrame implements ActionListener {

    Connection con = null;

    GUI() {
        JPanel p = new JPanel();
        JFrame f = new JFrame("Crime Data");

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(600, 600);

        f.setResizable(true);
        f.setLocationRelativeTo(null);
        GridBagConstraints gbc = new GridBagConstraints();
        getContentPane().setLayout(new GridBagLayout());

        gbc.insets = new Insets(5, 5, 5, 5);

        JLabel LongLabel = new JLabel("Enter Longitude here");
        LongLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 1;
        getContentPane().add(LongLabel, gbc);
        JTextField LongText = new JTextField(20);
        getContentPane().add(LongText, gbc);

        JLabel LatLabel = new JLabel("Enter Latitude here");
        LatLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 2;
        getContentPane().add(LatLabel, gbc);
        JTextField LatText = new JTextField(20);
        getContentPane().add(LatText, gbc);

        JLabel LSOANameLabel = new JLabel("Enter LSOA Name here");
        LSOANameLabel.setForeground(Color.gray);
        gbc.gridx = 0;
        gbc.gridy = 3;
        getContentPane().add(LSOANameLabel, gbc);
        JTextField LSOANameText = new JTextField(20);
        getContentPane().add(LSOANameText, gbc);

        JButton search = new JButton("Search");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(search, gbc);
        search.addActionListener(this);

        JButton exportnoid = new JButton("Export No Crime ID");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(exportnoid, gbc);

        JButton exportdup = new JButton("Export Duplicate ID");
        gbc.gridx = 0;
        gbc.gridy = -1;
        getContentPane().add(exportdup, gbc);

        f.add(getContentPane());
        pack();
        f.setVisible(true);
    }

   @Override
   public void actionPerformed(ActionEvent e) {
      if(e.getSource()==search){
          System.out.println("");
      } else {

      }
   }

}

class GUIHandler {
    public static void main(String[] args) {
        GUI a = new GUI();
    }
}

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

search переменная не является переменной экземпляра, ее область действия ограничена конструктором, поэтому ее нельзя использовать вне ее.

Объявить JButton search переменную после Connection con = null;.

Также обратите внимание, что в методе actionPerformed есть пустой оператор 'else'.

0 голосов
/ 07 мая 2018

класс GUI расширяет JFrame реализует ActionListener {

Connection con = null;
JButton search;

GUI() {
    JPanel p = new JPanel();
    JFrame f = new JFrame("Crime Data");

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(600, 600);

    f.setResizable(true);
    f.setLocationRelativeTo(null);
    GridBagConstraints gbc = new GridBagConstraints();
    getContentPane().setLayout(new GridBagLayout());

    gbc.insets = new Insets(5, 5, 5, 5);

    JLabel LongLabel = new JLabel("Enter Longitude here");
    LongLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 1;
    getContentPane().add(LongLabel, gbc);
    JTextField LongText = new JTextField(20);
    getContentPane().add(LongText, gbc);

    JLabel LatLabel = new JLabel("Enter Latitude here");
    LatLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 2;
    getContentPane().add(LatLabel, gbc);
    JTextField LatText = new JTextField(20);
    getContentPane().add(LatText, gbc);

    JLabel LSOANameLabel = new JLabel("Enter LSOA Name here");
    LSOANameLabel.setForeground(Color.gray);
    gbc.gridx = 0;
    gbc.gridy = 3;
    getContentPane().add(LSOANameLabel, gbc);
    JTextField LSOANameText = new JTextField(20);
    getContentPane().add(LSOANameText, gbc);
    search = new JButton("Search");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(search, gbc);
    search.addActionListener(this);

    JButton exportnoid = new JButton("Export No Crime ID");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(exportnoid, gbc);

    JButton exportdup = new JButton("Export Duplicate ID");
    gbc.gridx = 0;
    gbc.gridy = -1;
    getContentPane().add(exportdup, gbc);

    f.add(getContentPane());
    pack();
    f.setVisible(true);
}

}

0 голосов
/ 07 мая 2018

Нет, в области действия вашего класса нет переменной search GUI.

В конструкторе вашего класса есть локальная переменная search GUI.

Единственная переменная экземпляра, которую я пока вижу, это переменная con типа Connection.

Вы должны объявить search как переменную экземпляра GUI, как и con, если вы хотите использовать ее в другом методе. Мое предложение, вы делаете это private.

В качестве альтернативы вы можете использовать setActionCommand(String cmd), чтобы задать имя команды действия для вашего JButton. Затем вы можете использовать getActionCommand() вашего ActionEvent, чтобы получить название действия и соответственно отреагировать. Но мне не нравится этот подход, так как в этом случае компилятор не может помочь вам обнаружить конфликты имен.

...