2016-04-13 3 views
0

Я пытаюсь создать приложение, которое будет увеличивать месяц в объекте LocalDateTime при нажатии кнопки.Изменение компонента JFrame на основе нажатия кнопки из содержащегося JPanel

Объект LocalDateTime и JLabel, отображающий имя месяца, хранятся в основном классе, который расширяет JFrame.

JButton, который имеет ActionListener, увеличивая месяц объекта LocalDateTime на 1 при его нажатии, сохраняется в отдельном классе Panel1, который расширяет JPanel.

Класс Panel1 добавлен в JFrame. Что я должен сделать, чтобы JLabel отражал изменения, внесенные в объект LocalDateTime при нажатии кнопки?

Главный класс:

import javax.swing.*; 
import java.awt.*; 
import java.time.LocalDateTime; 

public class Main extends JFrame { 

    private LocalDateTime currentTime = LocalDateTime.now(); 
    private JLabel monthLabel; 

    public Main() { 
     super(); 
     setLayout(new BorderLayout()); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     monthLabel = new JLabel(currentTime.getMonth().name()); 

     add(monthLabel, BorderLayout.NORTH); 
     add(new Panel1(currentTime), BorderLayout.SOUTH); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String args[]) { 
     Main main = new Main(); 
    } 

} 

Panel1 Класс:

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.time.LocalDateTime; 

public class Panel1 extends JPanel implements ActionListener { 

    private LocalDateTime time; 
    private JButton incrementMonth; 

    public Panel1(LocalDateTime time) { 
     this.time = time; 

     incrementMonth = new JButton(">"); 
     incrementMonth.addActionListener(this); 
     add(incrementMonth); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == incrementMonth) { 
      time = time.plusMonths(1); 
     } 
    } 

} 

ответ

0

Что я должен сделать, чтобы сделать это так, что JLabel будет отражать изменения, внесенные в объект LocalDateTime, когда кнопка нажата?

Вот что:

  • Объявить monthLabel, как protected static.

    protected static JLabel monthLabel; 
    

    Таким образом, он будет виден другим классам в упаковке.

  • Добавить строку, чтобы изменить текст в вас actionPerformed() метод.

    public void actionPerformed(ActionEvent e) { 
        if (e.getSource() == incrementMonth) { 
         time = time.plusMonths(1); 
         Main.monthLabel.setText(time.getMonth().name()); 
        } 
    } 
    
1

Если вы хотите шаблон наблюдателя, вы можете использовать PropertyChangeListener на свинг компонентов. Ваш Panel1 должен сгореть событие на свойстве

public class Panel1 extends JPanel implements ActionListener { 

    private LocalDateTime time; 
    private JButton incrementMonth; 

    public Panel1(LocalDateTime time) { 
     this.time = time; 

     incrementMonth = new JButton(">"); 
     incrementMonth.addActionListener(this); 
     add(incrementMonth); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == incrementMonth) { 
      LocalDateTime oldValue = time; 
      time = time.plusMonths(1); 
      this.firePropertyChange("month", oldValue.getMonth().name(), time.getMonth().name()); 
     } 
    } 

} 

Свойство «месяц» это известно в следующем коде, в вашем главном классе:

super(); 
    setLayout(new BorderLayout()); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

    monthLabel = new JLabel(currentTime.getMonth().name()); 

    add(monthLabel, BorderLayout.NORTH); 
    Panel1 panel1 = new Panel1(currentTime); 
    panel1.addPropertyChangeListener("month", new PropertyChangeListener() { 
     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      monthLabel.setText(evt.getNewValue().toString()); 
     } 
    }); 
    add(panel1, BorderLayout.SOUTH); 

    pack(); 
    setVisible(true); 

Я предпочел это решение, чем связь свинг компоненты вместе или сделать их статическими.

Смежные вопросы