Давайте посмотрим, что делает этот конструктор:
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;
}
}