Для этого, вероятно, лучший вопрос/ответ, но то, что я нашел, не сработало, и у меня возникли проблемы с формулировкой вопроса для запроса google. В основном у меня есть JFrame с несколькими панелями и компонентами, которые извлекают данные из xml-файлов. Я использую переменную экземпляра JFrame private Date focusDate = new Date();
, чтобы сохранить информацию о том, какой день я хочу, чтобы каждая панель отображалась, насколько это хорошо.Triggering Java GUI для обновления
Проблема возникает сейчас, когда я пытаюсь обновить различные действия компонентов навигации после изменения «focusDate». У меня есть панель инструментов в JPanel NavButtons navPanel = new NavButtons(focusDate);
, которую я настраиваю как внутренний класс, а консольные отчеты focusDate
меняются, но я не могу получить JFrame до validate(), repaint(), etc...
, когда я вызываю свой метод setFocus(Date d)
.
я могу включать в себя больше моего кода, если это было бы полезно, но вот рассмотренный метод:
public void setFocus(Date d) throws IOException {
focusDate = d;
dispose();
// validate(); //Tried revalidate too, but DisplayView extends JFrame
// repaint();
// revalidate();
// pack();
// DisplayView view = new DisplayView(focusDate);
setVisible(true); }
и вот как я устанавливаю ActionListener в конструкторе:
public NavButtons(Date d) {
newDate = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(d));
weekBack.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
newDate = newDate.plusDays(-7);
try { setFocus(Date.from(newDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
} catch (IOException e) {
e.printStackTrace(); }
//validate();
//repaint();
}
});
Я не очень хорошо знаком с качелями, поэтому я уверен, что это некоторые незначительные детали, которые я просто не получаю, но если кто-то может объяснить, как повторно запускать передаваемый аргумент и обновлять дочерние компоненты кадра любителю, который будет с наибольшей оценкой.
Update Вот вся JFrame
package interfaceComponents;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.*;
import java.io.IOException;
import java.text.*;
import java.util.*;
import java.time.*;
public class DisplayView extends JFrame {
//instance variables
private Date focusDate = new Date();
//constructor
public DisplayView(Date d) throws IOException {
DisplayMenus menus = new DisplayMenus();
setJMenuBar(menus);
JPanel body = new JPanel();
body.setLayout(new BoxLayout(body, BoxLayout.Y_AXIS));
body.add(new DayView(focusDate));
LocalDate focusNextDay = LocalDate.now();
body.add(new DayView(Date.from(focusNextDay.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant())));
add(new JScrollPane(body), BorderLayout.CENTER);
JPanel footer = new JPanel();
NavButtons navPanel = new NavButtons(focusDate);
JLabel focusPoint = new JLabel(new SimpleDateFormat("E, dd MMM yyyy").format(focusDate).toString());
focusPoint.setForeground(Color.RED);
footer.setLayout(new BorderLayout());
footer.add(focusPoint, BorderLayout.CENTER);
footer.add(navPanel, BorderLayout.EAST);
footer.setBackground(Color.BLACK);
add(footer, BorderLayout.SOUTH);
pack(); }
public DisplayView() throws IOException { this(new Date()); }
public void setFocus(Date d) throws IOException {
focusDate = d;
SwingUtilities.updateComponentTreeUI(this);
// dispose();
// invalidate();
// validate(); //Tried revalidate too, but DisplayView extends JFrame
repaint();
// revalidate();
// pack();
// DisplayView view = new DisplayView(focusDate);
// setVisible(true);
}
public Date getFocus() { return focusDate; }
class NavButtons extends JPanel {
private JToolBar toolBar = new JToolBar("Navigation");
private JButton weekBack = new JButton("<<");
private JButton dayBack = new JButton("<");
private JButton returnToday = new JButton("Today");
private JButton nextDay = new JButton(">");
private JButton nextWeek = new JButton(">>");
private JButton calendar = new JButton("L");
private LocalDate newDate = LocalDate.now();
public NavButtons(Date d) {
newDate = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(d));
weekBack.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
newDate = newDate.plusDays(-7);
try { setFocus(Date.from(newDate.atStartOfDay(ZoneId.systemDefault()).toInstant()));
} catch (IOException e) {
e.printStackTrace(); }
// invalidate();
// validate();
// repaint();
}
});
dayBack.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { newDate = newDate.plusDays(-1); }
});
returnToday.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { newDate = LocalDate.now(); }
});
nextDay.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { newDate = newDate.plusDays(1); }
});
nextWeek.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { newDate = newDate.plusDays(7); }
});
toolBar.add(weekBack);
toolBar.add(dayBack);
toolBar.add(returnToday);
toolBar.add(nextDay);
toolBar.add(nextWeek);
toolBar.add(new GalileoMode());
toolBar.add(calendar);
add(toolBar); }
}
}
Как @MadProgrammer указывал, я должен иметь дату, сохраненную в отдельном объекте (как показано здесь):
package interfaceComponents;
import java.util.*;
public class FocusDate {
//instance variables
Date focus = new Date();
//constructors
//intentionally blank: public FocusDate() {}
//methods:
public void setFocus(Date d) {
focus = d; }
public Date getFocus() {
return focus; }
}
и Я отредактировал рамку как таковую:
public class DisplayView extends JFrame {
//instance variables
FocusDate focus = new FocusDate();
// private Date focusDate = new Date();
//constructor
public DisplayView(Date d) throws IOException {
// focusDate = d;
Date focusDate = focus.getFocus();
...
public void setFocus(Date d) throws IOException {
// focusDate = d;
focus.setFocus(d);
Все еще не делает что-то правильно, хотя ...
Посмотрите, поможет ли [этот вопрос] (http://stackoverflow.com/a/7630604/3547126). – goncalotomas
Рассмотрите возможность запуска runnable примера вашей проблемы. Он удалит работу над угадкой и приведет к лучшим ответам. – MadProgrammer
Какое решение должно было бы инкапсулировать дату внутри модели, которая передается каждому компоненту, который в ней нуждается. Модель позволит заинтересованным сторонам зарегистрировать обратный вызов, который будет уведомлять тогда, когда дата изменится, чтобы они могли предпринять соответствующие действия (как шаблон наблюдателя) – MadProgrammer