Добавление слушателя действия в Java для счетчика - PullRequest
0 голосов
/ 23 сентября 2019

Я довольно новый пользователь с программированием на Java около недели и немного опыта, как раньше, я использовал Python около 3 лет, но подумал, чтобы попробовать Java.Я пытался развить свои навыки, создавая небольшие проекты и приложения, и сейчас создаю небольшой счетчик графического интерфейса.

Я добился создания графического интерфейса с 2 кнопками и меткой и проверил математику, стоящую за приложением, ноЯ изо всех сил пытаюсь понять, как работает ActionListener, так как он чувствует себя совершенно иначе, чем python, когда у кнопки есть действие.

Это мой код;

package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.*;

public class GUI{
  //This creates a frame or panel to contain things
  public static void main(String[] args) {

  //Maths To The Counter
  int Counter = 0;
  System.out.println(Counter);
  Counter =+ 1;
  System.out.println(Counter);

  //Creating The Frame
  JFrame frame = new JFrame();

  JPanel panel = new JPanel();
  panel.setBackground(Color.WHITE);
  frame.getContentPane().add(panel);

  //Creating The Label
  JLabel label3 = new JLabel("Counter: ");
  panel.add(label3); 

  //Button Which should have a funtion to add and display the number
  JButton button = new JButton("Click Here.");
  panel.add(button);

  //Button to reset the counter
  JButton buttonReset = new JButton("Reset Counter.");
  panel.add(buttonReset);

  //Set Size Of Window
  frame.setSize(new Dimension(500, 400));
  //Set Starting Position to centre
  frame.setLocationRelativeTo(null);
  //Setting a default close action
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //Set Title
  frame.setTitle("Counter");
  //Disable Resize
  frame.setResizable(false);
  //Setting if its visible
  frame.setVisible(true);
  //Fits frame to fit everything
  frame.pack();


  }



}
    enter code here

Я знаю, что вpython действие находится в функции, так что это было моей логикой к этой проблеме, однако я видел, что вместо этого мне нужно использовать actionlistener, и я изо всех сил пытаюсь разобраться с этим.

Если бы кто-то мог показать мнекак этот тип действия должен быть реализован, было бы очень полезно, я посмотрел несколько видео на YouTube и провел небольшое исследование, но я все еще пытаюсь понять, как это сделать в моей ситуации.

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

Также приветствуются любые отзывы о структуре моего кода, так как я только начинаю в Java и знаю, что плохая структура может привести к ошибкам.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Этот код должен работать:

По сути, в основном методе я создаю экземпляр класса и вызываю метод для создания графического интерфейса.

Я также создал переменную экземпляра в качестве счетчика, иначе вы не сможете обновить переменную в слушателе действий.

public class Gui {

    private int counter;

    // This creates a frame or panel to contain things
    public static void main(String[] args) {

        Gui gui = new Gui();
        gui.create();
    }

    private void create() {

        // Creating The Frame
        JFrame frame = new JFrame();

        JPanel panel = new JPanel();
        panel.setBackground(Color.WHITE);
        frame.getContentPane().add(panel);

        // Creating The Label
        JLabel label3 = new JLabel("Counter: ");
        panel.add(label3);

        // Button Which should have a funtion to add and display the number
        JButton button = new JButton("Click Here.");
        panel.add(button);

        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(counter++);
            }
        });

        // Button to reset the counter
        JButton buttonReset = new JButton("Reset Counter.");
        panel.add(buttonReset);

        buttonReset.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                counter = 0;
            }
        });

        // Set Size Of Window
        frame.setSize(new Dimension(500, 400));
        // Set Starting Position to centre
        frame.setLocationRelativeTo(null);
        // Setting a default close action
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Set Title
        frame.setTitle("Counter");
        // Disable Resize
        frame.setResizable(false);
        // Setting if its visible
        frame.setVisible(true);
        // Fits frame to fit everything
      }
  }

С помощью лямбда-выражений вы можетеупростите слушателей действий следующим образом:

button.addActionListener(a -> System.out.println(counter++));
buttonReset.addActionListener(a -> counter = 0);

Если вы хотите написать более 1 оператора, вы можете просто поместить свой код в фигурные скобки:

button.addActionListener(a -> {
        System.out.println(counter++);
        System.out.println("doing more stuff...");
});
0 голосов
/ 23 сентября 2019

JButton имеет функцию под названием addActionListener.Вы можете передать слушателя действия, выполнив это:

button.addActionListener(() -> {
    // Do some logic here
});

Здесь я использую лямбда-выражение в качестве слушателя действия.Внутри лямбда-выражения вы можете разместить любую логику, какую захотите.

Также обратите внимание, что к одной кнопке можно добавить несколько слушателей различных действий.В двух словах, способ взаимодействия JButton с ActionListeners основан на шаблоне наблюдателя .

Представьте себе следующее: при нажатии JButton он уведомит об этомвсе его наблюдатели говорят: «Эй, меня прижали».Каждый наблюдатель может самостоятельно решить, что делать.В случае JButton все наблюдатели ActionListeners.Если вы добавите несколько ActionListeners, JButton уведомит их всех, и в результате будут выполнены все их функции actionPerformed(ActionEvent e).В приведенном выше примере я использовал лямбда-выражение, которое затем с помощью java интерпретируется как ActionListener.

Другие способы достижения точно такой же функциональности:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Do some logic here
    }
});

В примеревыше, вы используете anonymous class в качестве actionlistener.

public class MyClass {

    public MyClass() {
        JButton button = new JButton("press me");
        button.addActionListener(new MyActionListener());
    }

    private class MyActionListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            // Do some logic here
        }

    }

}

В приведенном выше примере используется внутренний класс.

В двух словах, есть множество способов, которыми вы можетесделать вашу кнопку функциональной.Выше приведены лишь несколько примеров того, как это сделать.

Это проясняет это немного больше, или у вас есть еще вопросы?

...