Это мое второе сообщение, связанное с Java Swing, поэтому простите меня, если мой вопрос слишком прост. Я пытаюсь заставить несколько JPanels общаться друг с другом. Я создаю простую 2D-сетку, в которую я могу добавить стены/заблокированные ячейки, а затем запустить простой алгоритм Floodfill/A * Search (с учетом местоположения старта и цели).Java Swing API - Как могут два JPanels общаться друг с другом?
Чтобы изолировать мою проблему, я решил, что работать с примером будет проще. Поэтому я создал простое приложение, которое позволяет пользователю писать в текстовое поле, при условии, что, что он нажал кнопку «Пуск». После записи в текстовое поле пользователь может нажать кнопку «Пуск», чтобы перевернуть его в состояние «Стоп». В состоянии «Стоп» пользователь не может добавить текст в текстовое поле (т. Е. Приложение не должно регистрировать никаких нажатий клавиш). Это простая проблема, которая действительно раскрывает мой вопрос здесь. Вот как пользовательский интерфейс выглядит как прямо сейчас:
Мой вопрос: Я должен быть в состоянии написать, когда кнопка показывает «Стоп» (так как он находится в режим редактирования), а I не должен иметь возможность писать в текстовой области, когда на кнопке отображается «Пуск» (так как это не режим редактирования). Однако из приведенных выше изображений вы можете видеть, что я могу писать в текстовой области в любом случае. Как мне сделать редактирование текстовой области зависимым от состояния кнопки?
Вот мой код, который пытается настроить это соединение между панелью кнопок и текстовой панелью, но это как-то не работает должным образом.
Я смотрел сообщения StackOverflow here и here, но, откровенно говоря, ответы мне не казались ясными.
SimpleTextPanel:
public class SimpleTextPanel extends JPanel implements PropertyChangeListener, ChangeListener {
private boolean canWrite;
public SimpleTextPanel() {
// set the border properties
canWrite = true;
TitledBorder title = BorderFactory.createTitledBorder("Simple Text Panel");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
JTextArea editSpace = new JTextArea(10, 20);
editSpace.setEditable(true);
editSpace.addPropertyChangeListener(this);
this.add(editSpace);
}
@Override
public void stateChanged(ChangeEvent changeEvent) {
JButton button = (JButton)changeEvent.getSource();
canWrite = button.getText().equals("Start");
}
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
JTextArea area = (JTextArea)propertyChangeEvent.getSource();
if(!canWrite) area.setText((String)propertyChangeEvent.getOldValue());
}
}
SimpleButtonPanel:
public class SimpleButtonPanel extends JPanel implements ActionListener {
JButton switchButton;
private boolean canWrite = true;
public SimpleButtonPanel(SimpleTextPanel txt) {
// set the border properties
TitledBorder title = BorderFactory.createTitledBorder("Simple Button Panel");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
switchButton = new JButton("Start");
switchButton.addActionListener(this);
switchButton.addChangeListener(txt);
this.add(switchButton);
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(switchButton.getText().equals("Start")) {
switchButton.setText("Stop");
canWrite = false;
} else if(switchButton.getText().equals("Stop")) {
switchButton.setText("Start");
canWrite = true;
}
}
}
SimpleExampleTest:
public class SimpleExampleTest extends JFrame {
public SimpleExampleTest() {
setLayout(new BorderLayout());
setTitle("Simple Example");
setSize(300, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
SimpleTextPanel text = new SimpleTextPanel();
SimpleButtonPanel button = new SimpleButtonPanel(text);
add(text, BorderLayout.NORTH);
add(button, BorderLayout.SOUTH);
//button.addPropertyChangeListener(text); // so that text editor knows whether to allow writing or not
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
SimpleExampleTest ex = new SimpleExampleTest();
ex.setVisible(true);
}
});
}
}
Любая/вся помощь приветствуется. Спасибо!
Вы можете использовать модель какого-то, чтобы поддерживать динамическую информацию между панелями или предоставить слушатель интерфейс какого-то, что может предупредить редактор оконных изменений состояния кнопки ... – MadProgrammer
вы можете дать SimpleButtonPanel переменная, относящаяся к содержащемуся классу: SimpleExampleTest. Затем в методе actionPerformed вы можете использовать эту переменную для вызова метода в ней, а оттуда выполнить действие в SimpleTextPanel – Stultuske
'public class SimpleTextPanel extends JPanel..' IMO, в котором проблема начинается. Ни одна панель не должна расширять панель, а вместо этого просто быть объектами панели. Элементы управления, которые должны влиять друг на друга, могут быть объявлены в том же классе, что и для панелей, что делает это вопросом. –