Доступ к переменной из объекта класса, кроме JPanel - PullRequest
0 голосов
/ 04 октября 2019

У меня есть класс, который является расширенным JPanel с различными компонентами Swing, такими как текстовые поля, флажки и т. Д.

Я пытаюсь получить доступ к параметрам конструктора из объектов класса, которые я создал и добавил вsecondPanel JPannel. Например, стоимость, имя и т. Д.

secondPanel.add(new ProductDesign("GPU: RTX 2070",649.99,"src/resources/rtx_card_2070.png"));
secondPanel.add(new ProductDesign("CPU: Intel i7-8700k",469.99,"src/resources/i7-8700k.png"));
secondPanel.add(new ProductDesign("CPU: Intel i5-9600k",309.99,"src/resources/i5_9600k.png"));

Я перебираю вторую панель и могу получить состояние некоторых компонентов колебания, в этом случае я могу получить значения selectBox с помощьюметод getAccessibleChild(3).

for (Component secondPanel : secondPanel.getComponents()) {
    ProductDesign.detect(secondPanel.getAccessibleContext().getAccessibleChild(3));
}

Однако я также хотел бы иметь возможность получить значения, которые имеет каждый объект класса. Например, стоимость или имя из конструктора класса. Есть ли способ сделать это с этой настройкой?

package main;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;

import javax.accessibility.Accessible;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class ProductDesign extends JPanel{

    private static final long serialVersionUID = -8719763672439672064L;

    final static int checkX = 130;
    final static int checkY = 58;

    ProductDesign(String name, double cost, String img){
        JLabel productIcon = new JLabel();
        productIcon.setBounds(10, 10, 100, 80);
        productIcon.setIcon(new ImageIcon(img));
        this.add(productIcon);

        JLabel nameLabel = new JLabel(name);
        nameLabel.setBounds(130,-30,400,100);
        nameLabel.setForeground(Color.WHITE);
        nameLabel.setFont(new Font(name, Font.BOLD, 20));
        this.add(nameLabel);

        JLabel priceTag = new JLabel("$"+cost);
        priceTag.setBounds(130,28,100,40);
        priceTag.setForeground(Color.white);
        this.add(priceTag);

        JCheckBox confirmItem = new JCheckBox();
        confirmItem.setBounds(130,58,25,25);
        this.add(confirmItem);

        JLabel quantityText = new JLabel("Qty:");
        quantityText.setForeground(Color.LIGHT_GRAY);
        quantityText.setBounds(160,60,60,20);
        this.add(quantityText);

        JTextArea productQuantity = new JTextArea();
        productQuantity.setBounds(190, 60, 60, 20);
        this.add(productQuantity);

        this.setLayout(null);
        this.setBackground(new Color(100,100,110));
        this.setBorder(BorderFactory.createStrokeBorder(new BasicStroke(3.0f), new Color(110,110,120)));
    }

    public static void detect(Accessible accessible) {
        if (((AbstractButton) accessible).isSelected()) {
            ((AbstractButton) accessible).setLocation(checkX-5, checkY);

        }
        else {
            ((AbstractButton) accessible).setLocation(checkX, checkY);
        }

    }
}

РЕДАКТИРОВАТЬ:

Я добавил слушатель действия, который теперь находится в ProductDesign классе

package main;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.accessibility.Accessible;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class ProductDesign extends JPanel{

    private static final long serialVersionUID = -8719763672439672064L;

    final static int checkX = 130;
    final static int checkY = 58;

    String name;
    Double cost;
    int count;



    ProductDesign(String name, double cost, String img){
        JLabel productIcon = new JLabel();
        productIcon.setBounds(10, 10, 100, 80);
        productIcon.setIcon(new ImageIcon(img));
        this.add(productIcon);

        JLabel nameLabel = new JLabel(name);
        nameLabel.setBounds(130,-30,400,100);
        nameLabel.setForeground(Color.WHITE);
        nameLabel.setFont(new Font(name, Font.BOLD, 20));
        this.add(nameLabel);

        JLabel priceTag = new JLabel("$"+cost);
        priceTag.setBounds(130,28,100,40);
        priceTag.setForeground(Color.white);
        this.add(priceTag);

        JCheckBox confirmItem = new JCheckBox();
        confirmItem.setBounds(130,58,25,25);
        this.add(confirmItem);

        confirmItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if (confirmItem.isSelected()) {
                    confirmItem.setLocation(checkX-5, checkY);
                }
                else {
                    confirmItem.setLocation(checkX, checkY);
                }
            }
        });

        JLabel quantityText = new JLabel("Qty:");
        quantityText.setForeground(Color.LIGHT_GRAY);
        quantityText.setBounds(160,60,60,20);
        this.add(quantityText);

        JTextArea productQuantity = new JTextArea();
        productQuantity.setBounds(190, 60, 60, 20);
        this.add(productQuantity);

        this.setLayout(null);
        this.setBackground(new Color(100,100,110));
        this.setBorder(BorderFactory.createStrokeBorder(new BasicStroke(3.0f), new Color(110,110,120)));

        this.name = name;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public double getCost() {
        return cost;
    }
}

Из этого прослушивателя действий, каков правильный синтаксис для использования этих нестатических методов для получения стоимости / имени и количества определенного экземпляра флажка, который был выбран?

1 Ответ

2 голосов
/ 04 октября 2019
  1. Создание переменных экземпляра для параметров
  2. Сохранение параметров в переменных вашего экземпляра
  3. Создание необходимых методов getName(), getCost() для доступа к данным.

В начале вашего класса:

private String name;
private int cost;
...

В конструкторе:

this.name = name;
this.cost = cost;
...

Пользовательские методы в вашем классе:

public String getName()
{
    return name;
}

...

Редактировать:

Код в ActionListener для флажка «verifyItem» может выглядеть примерно так:

JCheckBox checkBox = (JCheckBoox)event.getSource();
ProductDesign pd = (ProductDesign)checkbox.getParent();
String name = pd.getName();
...