Добавление ActionListener в JButton на JPanel, вложенном в другой пакет - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь получить доступ к JButtons на JPanel, на мой взгляд. Мой класс просмотра находится в пакете под названием проект. По сути, это JFrame с несколькими JPanels из пакета под названием views. Когда я использую вид в своем классе контроллеров, я могу получить доступ к панелям, но я не могу получить go ниже, чтобы получить кнопки. Я попытался изменить одну из кнопок на publi c, и все еще не мог получить к ней доступ. Также у меня есть функция получения, но это также не дает мне доступа. Я включил код и структуру проекта ниже.

Структура проекта

Project
  > src
    > project
        > View.java
        > Controller.java
    > views
        > JButtonPanel.java

project / View. java

package project;

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import config.Config;
import views.JButtonPanel;
import views.JColorPanel;
import views.JImagePanel;
import views.JMaskPanel;

public class View {
    protected JFrame jf;
    protected JPanel jButtonPanel;
    protected JPanel jImagePanel;
    protected JPanel jMaskPanel;
    protected JPanel jColorPanel;

    View() {
        BorderLayout bl = new BorderLayout();

        this.jf = new JFrame();
        this.jf.setTitle("Gradient coloring app");
        this.jf.setPreferredSize(new Dimension(Config.screenSize.width, Config.screenSize.height));
        this.jf.setLayout(bl);

        this.jButtonPanel = new JButtonPanel();
        this.jImagePanel = new JImagePanel(null);
        this.jColorPanel = new JColorPanel();
        this.jMaskPanel = new JMaskPanel();

        this.jf.add(this.jButtonPanel, BorderLayout.PAGE_START);
        this.jf.add(this.jImagePanel, BorderLayout.LINE_START);
        this.jf.add(this.jColorPanel, BorderLayout.LINE_END);
        this.jf.add(this.jMaskPanel, BorderLayout.PAGE_END);

        this.jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.jf.setResizable(false);
        this.jf.pack();
        this.jf.setVisible(true);
    }

    /**
     * @return the jButtonPanel
     */
    public JPanel getjButtonPanel() {
        return jButtonPanel;
    }

    /**
     * @return the jImagePanel
     */
    public JPanel getjImagePanel() {
        return jImagePanel;
    }

    /**
     * @return the jMaskPanel
     */
    public JPanel getjMaskPanel() {
        return jMaskPanel;
    }

    /**
     * @return the jColorPanel
     */
    public JPanel getjColorPanel() {
        return jColorPanel;
    }

    /**
     * @param jButtonPanel the jButtonPanel to set
     */
    public void setjButtonPanel(JPanel jButtonPanel) {
        this.jButtonPanel = jButtonPanel;
    }

    /**
     * @param jImagePanel the jImagePanel to set
     */
    public void setjImagePanel(JPanel jImagePanel) {
        this.jImagePanel = jImagePanel;
    }

    /**
     * @param jMaskPanel the jMaskPanel to set
     */
    public void setjMaskPanel(JPanel jMaskPanel) {
        this.jMaskPanel = jMaskPanel;
    }

    /**
     * @param jColorPanel the jColorPanel to set
     */
    public void setjColorPanel(JPanel jColorPanel) {
        this.jColorPanel = jColorPanel;
    }
}

views / JButtonPanel. java

package views;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JPanel;

import config.Config;

@SuppressWarnings("serial")
public class JButtonPanel extends JPanel {

    protected JButton targetButton;
    protected JButton colorSource;
    protected JButton calGrad;
    protected JButton addColorsToGradient;

    public JButtonPanel() {
        FlowLayout fl = new FlowLayout();
        this.setPreferredSize(new Dimension(Config.screenSize.width, (int) (Config.screenSize.height * 0.075)));
        this.setBorder(Config.buttonPanelBorder);
        this.setLayout(fl);

        this.targetButton = new JButton();
        this.targetButton.setText("Load a target image");
        this.add(this.targetButton);
        ...
    }

    /**
     * @return the targetButton
     */
    public JButton getTargetButton() {
        return targetButton;
    }
    ...
}

Буду признателен за любую помощь. Спасибо

1 Ответ

0 голосов
/ 21 января 2020

Проблема в том, что вы называете свою пользовательскую панель JPanel вместо пользовательской JButtonPanel:

... 

public class View {
protected JFrame jf;
protected JPanel jButtonPanel;
protected JPanel jImagePanel;
protected JPanel jMaskPanel;
protected JPanel jColorPanel;

View() { ...

Тогда нормально, что у вас нет доступа к кнопкам, определенным в вашей пользовательской JPanel расширение, потому что вы объявляете его как стандартную JPanel, которая на самом деле не имеет метода getTargetButton().

Для решения у вас есть два варианта:

  1. Объявите jButtonPanel как protected JButtonPanel jButtonPanel
  2. Приведите jButtonPanel к JButtonPanel (лучше, если вы проверяете с помощью instanceof, что это фактически объект JButtonPanel), когда вам нужно получить доступ к его полям.

Если вы не планируете замените реализацию jButtonPanel в будущем, я предлагаю вам go с первым вариантом.

Alessio

...