Как вы передаете объект в новую форму? - PullRequest
0 голосов
/ 26 мая 2018

Почему мой автомобильный объект не попадает в мой ViewCarForm?

Автомобиль передается в InventoryItemPanel.

public class InventoryItemPanel extends JPanel{
Car car;
Button button = new Button("View More Details");



public InventoryItemPanel(Car car){

    this.car = car;

    // executes ButtonActionPerformed when button is clicked.
    button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            ButtonActionPerformed(evt);
        }
    });
    add(button);


}

public void ButtonActionPerformed(java.awt.event.ActionEvent evt) {
    new ViewCarForm(car).setVisible(true);
}                                         
}

При нажатии кнопки предполагается, что та же самая машина будет переданаViewCarForm.

public class ViewCarForm extends javax.swing.JFrame {
Car car;


public ViewCarForm() {
    initComponents();
}

public ViewCarForm(Car car){
   new ViewCarForm().setVisible(true);
   jLabel.setText(car.getMake());
}
}

Однако метка в ViewCarForm не обновляется объектом car, поэтому я предполагаю, что он не проходит через?

1 Ответ

0 голосов
/ 26 мая 2018

Давайте посмотрим, что делает этот конструктор:

public ViewCarForm(Car car){
   new ViewCarForm().setVisible(true); // (A)
   jLabel.setText(car.getMake());      // (B)
}
  • В строке (A) вы создаете новый объект ViewCarForm - и вы делаете это в конструкторе ViewCarForm, а не то, что яРекомендуем это сделать, поскольку теперь у вас есть два экземпляра ViewCarForm, исходный и новый, который вы отображаете.
  • В строке (B) вы устанавливаете текст JLabel, переменную первого и неотображаемого экземпляра ViewCarForm (я предполагаю, что это переменная этого класса -вы никогда не показываете нам объявление переменной или создание экземпляра. ОК, это установит текст JLabel неотображаемого GUI, в то время как второй экземпляр ViewCarForm, тот, который вы делаете , имеетбез изменений в тексте его JLabel.
  • Вы не вызываете this() или initComponents() во втором конструкторе, и поэтому код из первого конструктора по умолчанию, включаяinitComponents(); call, никогда не вызывается, и поэтому компоненты никогда не выстраиваются должным образом при вызове этого конструктора.

Решение: не делайте этого , не создавайтедва экземпляра ViewCarForm, особенно из конструктора одного и того же класса. Единственная причина, по которой у вас нет ошибки stackoverflow, заключается в том, что у вашего класса есть два конструктора, но даже без stackoverflow это безумиеявляется.Создайте только один экземпляр и установите его текст JLabel. Избавиться от строки (A)

Кроме того, если ViewCarForm является вторичным окном, это даже не должен быть JFrame, а скорее JDialog, модальный или немодальный в зависимости от ваших потребностей.

Кроме того, вы инициализируете компоненты только в одном конструкторе ViewCarForm, а не в другом.Поэтому JLabel не будет отображаться во втором конструкторе / экземпляре.

Например:

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Window;
import javax.swing.*;

public class InventoryFoo extends JPanel {
    private static final Car FIRST_CAR = new Car("Honda");
    private InventoryItemPanel inventoryItemPanel = new InventoryItemPanel(FIRST_CAR);

    public InventoryFoo() {

        inventoryItemPanel.setBorder(BorderFactory.createTitledBorder("Inventory Item"));

        add(inventoryItemPanel);
    }

    private static void createAndShowGui() {
        InventoryFoo mainPanel = new InventoryFoo();

        JFrame frame = new JFrame("InventoryFoo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

class InventoryItemPanel extends JPanel {
    Car car;

    // Button button = new Button("View More Details"); // should be a JButton
    JButton button = new JButton("View More Details"); // should be a JButton

    public InventoryItemPanel(Car car) {

        this.car = car;

        // executes ButtonActionPerformed when button is clicked.
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ButtonActionPerformed(evt);
            }
        });
        add(button);

    }

    public void ButtonActionPerformed(java.awt.event.ActionEvent evt) {
        // new ViewCarPanel(car).setVisible(true);

        // get current JFrame
        Window thisJFrame = SwingUtilities.getWindowAncestor(this);
        // Create a non-modal JDialog
        JDialog dialog = new JDialog(thisJFrame, "Car Make", ModalityType.MODELESS);
        // create new viewCarPanel
        ViewCarPanel viewCarPanel = new ViewCarPanel(car);
        // add to dialog
        dialog.add(viewCarPanel);
        dialog.pack();
        dialog.setLocationRelativeTo(thisJFrame);
        dialog.setVisible(true);
    }
}

// better for this to be a JPanel
class ViewCarPanel extends JPanel {
    Car car;
    private JLabel jLabel = new JLabel();

    public ViewCarPanel() {
        add(new JLabel("Car Make:"));
        add(jLabel);
        setPreferredSize(new Dimension(300, 80));
    }

    public ViewCarPanel(Car car) {
        // so that we init components from the default constructor
        this(); 

        // new ViewCarPanel().setVisible(true);
        jLabel.setText(car.getMake());
    }
}

class Car {

    private String make;

    public Car(String make) {
        this.make = make;
    }

    public String getMake() {
        return this.make;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...