Как добавить параметр в mouselistener

Я хочу, чтобы ответ JLabel распечатывал ответ, когда пользователи нажимали метку. Но я обнаружил, что строка 104 не использует «ввод» из HanoisFrames. Он продолжает использовать 0 в качестве «ввода» и выводит «0». Я попытался написать строку 96 как «частный класс MouseHandler расширяет HanoisFrames, реализует MouseListener, MouseMotionListener», и я использовал «super (int)», но это не работает. Что я должен делать?

package Hanois;

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

public class Hanoi {

    private JFrame frame;
    JButton[][] buttons= new JButton[3][3];

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Hanoi window = new Hanoi();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Hanoi() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 901, 696);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        JMenuBar menubar=new JMenuBar();//Menu
        frame.setJMenuBar(menubar);

        JMenu file= new JMenu("File");
        file.setFont(new Font("Segoe UI", Font.PLAIN, 21));
        menubar.add(file);
        JMenuItem exit= new JMenuItem("Exit");//provide users a way to exit 
        exit.setFont(new Font("Segoe UI", Font.PLAIN, 21));
        file.add(exit);

        class exitaction implements ActionListener{
        public void actionPerformed(ActionEvent e) {
              System.exit(0);
         }

        }
        exit.addActionListener(new exitaction());


        JPanel panelone = new JPanel();
        frame.getContentPane().add(panelone, BorderLayout.CENTER);
        panelone.setBackground(Color.WHITE);
        panelone.setLayout(new GridLayout(3,4,3,3));


        JPanel paneltwo = new JPanel();
        frame.getContentPane().add(paneltwo, BorderLayout.NORTH);
        paneltwo.setBackground(Color.WHITE);


        JLabel lblFunHanoiTower = new JLabel("Fun Hanoi Tower");
        frame.getContentPane().add(paneltwo, BorderLayout.NORTH);
        lblFunHanoiTower.setForeground(Color.BLACK);
        lblFunHanoiTower.setBackground(SystemColor.activeCaption);
        lblFunHanoiTower.setFont(new Font("Viner Hand ITC", Font.PLAIN, 36));
        paneltwo.add(lblFunHanoiTower); 

        ActionListener listener =new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                for(int row = 0; row < buttons.length ; row++) {
                    for(int col= 0; col < buttons[0].length ;col++) {
                        if (e.getSource()==buttons[row][col]){
                            buttons[row][col].setBackground(Color.lightGray);
                            HanoisFrames f= new HanoisFrames(((row*3)+(col+3)));
                            f.setVisible(true);//
                        }
                    }
                }
            }

        };


        for(int row = 0; row < buttons.length ; row++) {
            for(int col= 0; col < buttons[0].length ;col++) {
                buttons[row][col] = new JButton("level "+String.valueOf((row*3)+(col+3)-2));
                buttons[row][col].setFont(new Font("Tempus Sans ITC", Font.BOLD, 32));
                buttons[row][col].setBackground(SystemColor.controlHighlight);
                buttons[row][col].setSize(6, 6);
                buttons[row][col].addActionListener(listener);

                panelone.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
                panelone.add(buttons[row][col]);
                }
            }
        }

}







    package Hanois;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;

    public class HanoisFrames extends JFrame {

        private JPanel contentPane;

        private JButton ret ;
        private JButton next;
        private JButton last;
        private JLabel answer;
        private JMenu menu;
        private JButton reset;
        private JLabel move;
        private JPanel panel;
        static int input;
        private JLabel lblLevel;
        boolean showAnswer=false;

        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        HanoisFrames frame = new HanoisFrames(input);
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        /**
         * Create the frame.
         */
        public HanoisFrames(int input) {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 901, 696);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);

            MouseHandler handler=new MouseHandler();

            panel = new JPanel();
            contentPane.add(panel, BorderLayout.SOUTH);
            panel.setLayout(new GridLayout(2,3));

            move = new JLabel("   Move");
            panel.add(move);

            reset = new JButton("Reset");
            panel.add(reset);

            answer = new JLabel();
            answer.setHorizontalAlignment(SwingConstants.CENTER);
            panel.add(answer);
            answer.setText("Answer");
            answer.addMouseListener(handler);
            answer.addMouseMotionListener(handler);

            last = new JButton("Last");
            panel.add(last);

            ret = new JButton("Return");
            panel.add(ret);

            next = new JButton("Next");
            panel.add(next);

            lblLevel = new JLabel("LEVEL   "+ String.valueOf(input-2));
            lblLevel.setHorizontalAlignment(SwingConstants.CENTER);
            lblLevel.setFont(new Font("Viner Hand ITC", Font.PLAIN, 36));
            contentPane.add(lblLevel, BorderLayout.NORTH);
        }

        public int hanoiCalculator(int input) {
            if (input==0){
                  return 0;
                }else if (input==1){
                  return 1;
                }else{
                  return 2*(hanoiCalculator(input-1)+1)-1; 
                }

        }

        private class MouseHandler implements MouseListener,MouseMotionListener {

            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            public void mousePressed(MouseEvent e) {
                answer.setText("Answer:   "+String.valueOf(hanoiCalculator(input)).toString());

            }
            @Override
            public void mouseDragged(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            public void mouseMoved(MouseEvent e) {
                // TODO Auto-generated method stub

            }


            public void mouseEntered(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            public void mouseExited(MouseEvent e) {
                // TODO Auto-generated method stub

            }

            public void mouseReleased(MouseEvent e) {
                answer.setText("Answer:   ");

            }

        }

    }

Где вы меняете значение, удерживаемое input, когда программа работает? И если вы не измените его значение, как вы ожидаете, что текст JLabel изменится?

Hovercraft Full Of Eels 09.06.2019 04:07

И, как вы понимаете, наследование — это нет ответ. Ключ изменяет состояние программы во время ее работы, что означает изменение значений, содержащихся в ключевых полях программы, таких как input.

Hovercraft Full Of Eels 09.06.2019 04:10

Где вы меняете значение, хранящееся на входе, во время работы программы? -- Я меняю значения в классе Hanoi. Прежде чем я напишу mouselistener, ввод работал хорошо.

Weilan Tao 09.06.2019 04:15

Нет, не меняешь. Поле ввода является статическим -- плохой, вы никогда не устанавливаете его из конструктора вашего класса GUI -- плохой. Не думайте, что ваш код что-то делает — ТЕСТОВОЕ ЗАДАНИЕ это и видеть то, что он делает.

Hovercraft Full Of Eels 09.06.2019 04:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь:

public class HanoisFrames extends JFrame {

    private JPanel contentPane;

    // ...

    private JPanel panel;
    static int input;

Вы никогда не устанавливаете входное значение в своем конструкторе HanoiFrames, поэтому оно остается значением по умолчанию для поля int, 0. Но даже если вы установили поле, поскольку оно является статическим, любые изменения, внесенные в него в любом классе HanoiFrames, изменятся. значение в классах все HanoiFrames, поэтому не можем будет статическим полем.

Итак, измените объявление ввода на нестатическое:

public class HanoisFrames extends JFrame {

    private JPanel contentPane;

    private JButton ret;
    //.....
    private JPanel panel;
    private int input;  // private non-static field now

и установите его в конструкторе:

public HanoisFrames(int input) {
    this.input = input;

Таким образом, каждый HanoisFrames будет иметь уникальное и надежное входное значение.


Боковая рекомендация:

Я бы посоветовал не создавать, а затем обменивать кучу JFrames. Вместо этого направьте свой код на создание панелей JPanel, а затем замените их при необходимости с помощью CardLayout.

Я понимаю. Большое спасибо!

Weilan Tao 09.06.2019 04:45

Другие вопросы по теме