Добавление JButton ActionListener (в одном файле * .java) к кнопке в другом файле * .java не работает - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь добавить ActionListener в JButton, который определен в другом файле * .java, но он не работает.Если я назову этот JButton из основного публичного класса, он будет работать нормально, чего мне не хватает?

Я создаю простое приложение Paint с использованием Java Swing.Я разделил код на несколько файлов * .java, чтобы сделать его более читабельным.JButtons определены в файле SideBar.java, и я хотел добавить файл ActionController.java, который бы вызывал все actionListeners для JButtons.НО, когда я добавляю код для .addActionListener () (в файле ActionController.java), ничего не происходит, когда я нажимаю кнопку.Но когда я добавляю тот же код в файл Main.java, нажатая кнопка работает просто отлично.Может кто-нибудь сказать мне, что мне не хватает?

У меня есть еще один вопрос, касающийся читабельности кода.Я новичок в Java, поэтому мой вопрос в том, хороша ли логика для разделения кода на такое количество классов?Я создал класс Main, который бы определял фрейм приложения, SideBar.java, который будет содержать весь макет боковой панели, TopMenu.java, который будет содержать меню для приложения, DrawingArea.java, который будет графикой для бланка.документ приложения, Draw.java, который будет содержать все функции для рисования (изменение размера карандаша, выбор цвета), и AcionController.java, который назначит все функции (определенные в файле Draw.java) кнопкам, ползунками т. д. Это хороший способ создания приложения или вы бы предложили разделить его по-другому?

Ниже вы можете найти код для моего написанного до сих пор приложения:

Main.java

package sample;

import sample.applicationLayout.ActionController;
import sample.applicationLayout.DrawingArea;
import sample.applicationLayout.TopMenu;
import sample.applicationLayout.SideBar;
import javax.swing.*;
import java.awt.*;

public class Main {

    Main() {

        //creating Frame for the application
        JFrame frame = new JFrame("Paint Application");

        //creating menu
        TopMenu menu = new TopMenu();
        frame.setJMenuBar(menu);
        //END OF MENU


        SideBar sideBar = new SideBar();
        DrawingArea drawingArea = new DrawingArea();

        ActionController actionController = new ActionController();
        actionController.clickOnButtons();

        frame.add(sideBar, BorderLayout.WEST);
        frame.add(drawingArea, BorderLayout.CENTER);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1200, 800);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }//end of Main()

    public static void main(String[] args) {
        new Main();
    }//end of public static void main(String[] args)

}//end of Main class

ActionController.java

package sample.applicationLayout;

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

public class ActionController {

        SideBar sideBar = new SideBar();
        ListenForButton listenForButton = new ListenForButton();

        public ActionController() {
        }

        public void clickOnButtons() {
                sideBar.getButton_pencil().addActionListener(listenForButton);

        }

        //listener for the buttons
        public class ListenForButton implements ActionListener {
                public void actionPerformed(ActionEvent e) {

                        System.out.println("button 1");

                }//end of public void actionPerformed
        }//end of public class ListenForButton

}//end of ActionController class

Draw.java

package sample;

public class Draw {
}

TopMenu.java

package sample.applicationLayout;

import javax.swing.*;

public class TopMenu extends JMenuBar {

    public TopMenu() {

        JMenu fileMenu = new JMenu("File");
        JMenu infoMenu = new JMenu("Info");

        JMenuItem newMenuItem = new JMenuItem("New");
        JMenuItem openMenuItem = new JMenuItem("Open");
        JMenuItem saveMenuItem = new JMenuItem("Save");
        JMenuItem clearMenuItem = new JMenuItem("Clear");
        JMenuItem exitMenuItem = new JMenuItem("Exit");
        JMenuItem aboutmeMenuItem = new JMenuItem("About");

        this.add(fileMenu);
        this.add(infoMenu);

        fileMenu.add(newMenuItem);
        fileMenu.add(openMenuItem);
        fileMenu.add(saveMenuItem);
        fileMenu.add(clearMenuItem);
        fileMenu.add(exitMenuItem);
        infoMenu.add(aboutmeMenuItem);

    }//end of TopMenu()

}//end of TopMenu extends JMenuBar

DrawingArea.java

package sample.applicationLayout;

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

public class DrawingArea extends JPanel {

    public DrawingArea() {

        this.setPreferredSize(new Dimension(1100, 800));

        this.setBackground(Color.WHITE);
    }//end of DrawingArea()

}//end of DrawingArea extends JPanel

SideBar.java

package sample.applicationLayout;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;

public class SideBar extends JPanel {


    private JButton button_pencil, button_brush, button_line, button_oval, button_rectangle,
            button_filled_oval, button_filled_rectangle, button_text, button_eraser, button_bucket;



    //===========================================

    public JButton getButton_pencil() {
        return button_pencil;
    }




    //===========================================


    public SideBar() {



        this.setPreferredSize(new Dimension(120, 800));
        BoxLayout boxLayout = new BoxLayout(this, BoxLayout.Y_AXIS);

        //fist JPanel with buttons
        JPanel panelA = new JPanel();
 //       panelA.setBackground(Color.WHITE);
        panelA.setPreferredSize(new Dimension(120, 250));
        Border panelAborder = BorderFactory.createTitledBorder("Paint:");
        panelA.setBorder(panelAborder);

        panelA.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        //icons for buttons
        ImageIcon icon_pencil = new ImageIcon("graphics/icon_pencil.png");
        ImageIcon icon_brush = new ImageIcon("graphics/icon_brush.png");
        ImageIcon icon_line = new ImageIcon("graphics/icon_line.png");
        ImageIcon icon_oval = new ImageIcon("graphics/icon_oval.png");
        ImageIcon icon_rectangle = new ImageIcon("graphics/icon_rectangle.png");
        ImageIcon icon_filled_oval = new ImageIcon("graphics/icon_filled_oval.png");
        ImageIcon icon_filled_rectangle = new ImageIcon("graphics/icon_filled_rectangle.png");
        ImageIcon icon_text = new ImageIcon("graphics/icon_text.png");
        ImageIcon icon_eraser = new ImageIcon("graphics/icon_eraser.png");
        ImageIcon icon_bucket = new ImageIcon("graphics/icon_bucket.png");


        //creating JButtons for basic paint drawing functions
        button_pencil = new JButton();
        button_brush = new JButton();
        button_line = new JButton();
        button_oval = new JButton();
        button_rectangle = new JButton();
        button_filled_oval = new JButton();
        button_filled_rectangle = new JButton();
        button_text = new JButton();
        button_eraser = new JButton();
        button_bucket = new JButton();

        //set size of the buttons
        button_pencil.setPreferredSize(new Dimension(35,35));
        button_brush.setPreferredSize(new Dimension(35,35));
        button_line.setPreferredSize(new Dimension(35,35));
        button_oval.setPreferredSize(new Dimension(35,35));
        button_rectangle.setPreferredSize(new Dimension(35,35));
        button_filled_oval.setPreferredSize(new Dimension(35,35));
        button_filled_rectangle.setPreferredSize(new Dimension(35,35));
        button_text.setPreferredSize(new Dimension(35,35));
        button_eraser.setPreferredSize(new Dimension(35,35));
        button_bucket.setPreferredSize(new Dimension(35,35));

        //color picker should be in an individual JPane

        //setting icons to buttons
        button_pencil.setIcon(icon_pencil);
        button_brush.setIcon(icon_brush);
        button_line.setIcon(icon_line);
        button_oval.setIcon(icon_oval);
        button_rectangle.setIcon(icon_rectangle);
        button_filled_oval.setIcon(icon_filled_oval);
        button_filled_rectangle.setIcon(icon_filled_rectangle);
        button_text.setIcon(icon_text);
        button_eraser.setIcon(icon_eraser);
        button_bucket.setIcon(icon_bucket);


        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_pencil, gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_brush, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_line, gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_oval, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_rectangle, gbc);

        gbc.gridx = 1;
        gbc.gridy = 2;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_filled_oval, gbc);

        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_filled_rectangle, gbc);


        gbc.gridx = 1;
        gbc.gridy = 3;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_text, gbc);

        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_eraser, gbc);

        gbc.gridx = 1;
        gbc.gridy = 4;
        gbc.insets = new Insets(5,5,5,5);
        panelA.add(button_bucket, gbc);




        //second JPanel with sliders
        JPanel panelB = new JPanel();
 //     panelB.setBackground(Color.red);
        panelB.setPreferredSize(new Dimension(120, 200));
        Border panelBborder = BorderFactory.createTitledBorder("Paint:");
        panelB.setBorder(panelBborder);

        panelB.add(new JButton("button1"));
        panelB.add(new JButton("button2"));


        //third JPanel with color picker
        JPanel panelC = new JPanel();
//      panelC.setBackground(Color.blue);
        panelC.setPreferredSize(new Dimension(120, 200));
        Border panelCborder = BorderFactory.createTitledBorder("Paint:");
        panelC.setBorder(panelCborder);

        panelC.add(new JButton("button1"));
        panelC.add(new JButton("button2"));


        //adding JPanels to main JPanel
        this.add(panelA, BorderLayout.NORTH);
        this.add(panelB, BorderLayout.CENTER);
        this.add(panelC, BorderLayout.SOUTH);

    }//end of public SideBar()


}//end of public class SideBar extends JPanel

Код для прослушивателя действий JButton (который определен в SideBar.java) можно найти в файле ActionController.java.

1 Ответ

0 голосов
/ 19 апреля 2019

Хорошо! Я снова отвечаю на свой вопрос :) Но я разобрался с ответом, может быть, это поможет кому-то еще. Проблема заключалась в двойной инициализации класса SideBar, один раз в файле Main.java и во-вторых в файле ActionController.java. Я изменил следующий код:

В файле Main.java:

actionController.clickOnButtons();

изменено на:

actionController.clickOnButtons(sideBar);

А в файле ActionController.java:

SideBar sideBar = new SideBar();
ListenForButton listenForButton = new ListenForButton();

public ActionController() {
}

public void clickOnButtons() {
    sideBar.getButton_pencil().addActionListener(listenForButton);

}

изменено на:

ListenForButton listenForButton = new ListenForButton();

public ActionController() {
}

public void clickOnButtons(SideBar sideBar) {
    sideBar.getButton_pencil().addActionListener(listenForButton);

}

Может быть, это даст подсказку кому-то еще в будущем.

...