Среди ваших проблем:
- Вы никогда не устанавливаете имя файла класса поезда (проверьте - где вы когда-либо вызывали
fileName = something
?)
- Вы создаете новые объекты поезда и ожидаете, что новый объект сможет воспринимать изменения, внесенные в другие объекты поезда. Java так не работает. Вам нужно протестировать тот же объект, который вы меняете.
- Ваши соглашения об именах программ сбивают с толку и опасны. Помните, что имена классов начинаются с заглавной буквы. Не давайте переменным те же имена, что и несвязанному классу, например, вашему классу поезда и кнопке поезда.
- Ваша программа имеет много ненужной сложности, такой как параллельные массивы, которые затрудняют отладку и усовершенствование.
- Вы меняете содержимое JPanel вместо того, чтобы использовать гораздо более простой в использовании CardLayout, который сделает это за вас.
Например, вы можете инкапсулировать имена строк JButton и имена файлов в класс или перечисление. Преимущество использования класса заключается в том, что вы можете считывать данные из файла и создавать объекты класса из данных файла, что дает дополнительную гибкость, однако для целей моего примера и во избежание добавления дополнительных файлов я используйте перечисление, что-то вроде
public enum ButtonFileName {
MONDAY("Monday", KeyEvent.VK_M, "monday_blues.jpg"),
TUESDAY("Tuesday", KeyEvent.VK_T, "tuesday_fun.jpg"),
WEDNESDAY("Wednesday", KeyEvent.VK_W, "humpday.jpg"),
THURSDAY("Thursday", KeyEvent.VK_H, "almost_friday.jpg");
private String buttonText;
private String fileName;
private int mnemonic;
private ButtonFileName(String buttonText, int mnemonic, String fileName) {
this.buttonText = buttonText;
this.mnemonic = mnemonic;
this.fileName = fileName;
}
public String getButtonText() {
return buttonText;
}
public int getMnemonic() {
return mnemonic;
}
public String getFileName() {
return fileName;
}
}
Затем я могу дать своему основному классу переменную ButtonFileName, selectedButtonFileName, а затем заполнить эту переменную при нажатии кнопки. Я также могу создать свои собственные действия, по одному для каждого перечисления ButtonFileName, и использовать эти действия для установки своих кнопок. Например:
import java.awt.CardLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class Home2 extends JPanel {
private static final String TRAIN_PANEL = "train panel";
private static final String BTN_ROW_PANEL = "btn row panel";
private CardLayout cardLayout = new CardLayout();
private ButtonFileName selectedButtonFileName = null;
private JPanel buttonRowPanel = new JPanel();
private JPanel trainPanel = new JPanel();
public Home2() {
buttonRowPanel = createButtonRowPanel();
trainPanel = createTrainPanel();
setLayout(cardLayout);
add(buttonRowPanel, buttonRowPanel.getName());
add(trainPanel, trainPanel.getName());
}
private JPanel createButtonRowPanel() {
JPanel btnRowPanel = new JPanel(new GridLayout(1, 0, 5, 5));
btnRowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
btnRowPanel.setName(BTN_ROW_PANEL);
for (ButtonFileName btnFileName : ButtonFileName.values()) {
JButton btn = new JButton(new RowButtonAction(btnFileName, this));
btnRowPanel.add(btn);
}
return btnRowPanel;
}
private JPanel createTrainPanel() {
JPanel trainPanel = new JPanel();
trainPanel.setName(TRAIN_PANEL);
JButton trainBtn = new JButton(new TrainAction("Train", KeyEvent.VK_T, this));
trainPanel.add(trainBtn);
return trainPanel;
}
public ButtonFileName getSelectedButtonFileName() {
return selectedButtonFileName;
}
public void setSelectedButtonFileName(ButtonFileName selectedButtonFileName) {
this.selectedButtonFileName = selectedButtonFileName;
}
public void nextCardLayoutView() {
cardLayout.next(this);
}
private static void createAndShowGui() {
JFrame frame = new JFrame("Home2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Home2());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
Опять перечисление
enum ButtonFileName {
MONDAY("Monday", KeyEvent.VK_M, "monday_blues.jpg"),
TUESDAY("Tuesday", KeyEvent.VK_T, "tuesday_fun.jpg"),
WEDNESDAY("Wednesday", KeyEvent.VK_W, "humpday.jpg"),
THURSDAY("Thursday", KeyEvent.VK_H, "almost_friday.jpg");
private String buttonText;
private String fileName;
private int mnemonic;
private ButtonFileName(String buttonText, int mnemonic, String fileName) {
this.buttonText = buttonText;
this.mnemonic = mnemonic;
this.fileName = fileName;
}
public String getButtonText() {
return buttonText;
}
public int getMnemonic() {
return mnemonic;
}
public String getFileName() {
return fileName;
}
}
Моя акция на поезд JButton
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
@SuppressWarnings("serial")
public class TrainAction extends AbstractAction {
private Home2 home;
public TrainAction(String name, int mnemonic, Home2 home) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
this.home = home;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Selected File Name: "
+ home.getSelectedButtonFileName().getFileName());
home.nextCardLayoutView();
}
}
Мои действия для кнопок строк
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
@SuppressWarnings("serial")
public class RowButtonAction extends AbstractAction {
private ButtonFileName btnFileName;
private Home2 home;
public RowButtonAction(ButtonFileName btnFileName, Home2 home) {
super(btnFileName.getButtonText());
putValue(MNEMONIC_KEY, btnFileName.getMnemonic());
this.btnFileName = btnFileName;
this.home = home;
}
@Override
public void actionPerformed(ActionEvent e) {
home.setSelectedButtonFileName(btnFileName);
home.nextCardLayoutView();
}
}
Что касается гибкости, скажем, я хотел добавить еще одну кнопку JButton и имя файла. Добавьте элемент Friday в перечисление, и все готово.
person
Hovercraft Full Of Eels
schedule
14.10.2014
getFileName()
. Нет, проблема заключается скорее в том, когда получить этот результат, поскольку вам нужно, чтобы один класс уведомлялся об изменении состояния одной из его переменных. Чтобы решить эту проблему, рассмотрите возможность использования какого-либо прослушивателя, чтобы Home мог получать уведомления при изменении переменной fileName. Здесь хорошо работает шаблон наблюдателя, и я часто реализовывал его с помощью PropertyChangeListeners и PropertyChangeSupport.... continued ....
- person Hovercraft Full Of Eels   schedule 14.10.2014test
. - person Pshemo   schedule 14.10.2014... continued ....
Например, ознакомьтесь с кодом в этом ответе. - person Hovercraft Full Of Eels   schedule 14.10.2014main
вы создаете новый экземплярClass3
, для которого вы вызываете методsetFilename
, который выводит приветствие, но вы нигде не используете этот экземпляр. Вместо этого в методе Class2actionPerformed
вы создаете новый (отдельный) экземплярClass3
и не передаетеfilename
этому новому экземпляру, поэтому он остаетсяnull
. Не лучше ли было бы передатьClass2
экземпляр конструктораClass3
, сохранить его в поле и повторно использовать вactionPerformed
? - person Pshemo   schedule 16.10.2014actionPerformed
. Я имею в виду что-то вроде этого: pastebin.com/u7GGz1Ns - person Pshemo   schedule 17.10.2014