Я пытаюсь добавить 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.