Это мое первое приложение Swing, поэтому я использовал Builder Builder NetBeans. Для запуска моделирования используется кнопка "Пуск" (две циклы: внешняя по дням и внутренняя по часам). На каждой итерации цикл должен останавливаться. При нажатии кнопки "Стоп" симуляция должна останавливаться. Я пытался: 1)
private void StartActionPerformed(java.awt.event.ActionEvent evt) {
Timer timer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
while(presentDay <= numberOfDays){
jTextField2.setText(Integer.toString(presentDay));
for(; presentTime <= 18; presentTime++){
jTextField6.setText(Integer.toString(presentTime));
StringBuilder res = new StringBuilder();
for(Event ev: schedule[presentDay-1].day){
if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
res.append(ev);
ev.setStatus(1);
}
}
currentEvent.setText(res.toString());
// Pause should here
}
presentTime = 9;
presentDay++;
}
}
});
timer.start();
}
2) Добавить таймер в конструкторе основного класса
public PlanningSystem() {
initComponents();
...
timer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
while(presentDay <= numberOfDays){
jTextField2.setText(Integer.toString(presentDay));
for(; presentTime <= 18; presentTime++){
jTextField6.setText(Integer.toString(presentTime));
StringBuilder res = new StringBuilder();
for(Event ev: schedule[presentDay-1].day){
if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
res.append(ev);
ev.setStatus(1);
}
}
currentEvent.setText(res.toString());
// Pause here
}
presentTime = 9;
presentDay++;
}
}
});
}
private void StartActionPerformed(java.awt.event.ActionEvent evt) {
timer.start();
}
Но оба пути не сработали. Надеюсь, вы поможете решить эту проблему. И извините за мой английский :)
================================================== ==================== После редактирования:
private void StartActionPerformed(java.awt.event.ActionEvent evt) {
if(presentDay <= numberOfDays){
jTextField2.setText(Integer.toString(presentDay));
Timer tim = new Timer (5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(presentTime <= 18){
jTextField6.setText(Integer.toString(presentTime));
StringBuilder res = new StringBuilder();
for(Event ev: schedule[presentDay-1].day){
if((presentTime <= ev.getTimeFinish()) && (presentTime >= ev.getTimeStart())){
res.append(ev);
ev.setStatus(1);
}
}
currentEvent.setText(res.toString());
presentTime++;
}
}
});
tim.start();
presentTime = 9;
presentDay++;
}
}
Проблема с циклом while. Вы приращением presentDay
в numberOfDays
первый раз таймер называется. После этого ничего не изменится снова.
Я верю (хотя из-за частичного кода, который вы опубликовали, я не могу быть уверен), что если вы выберете цикл while, он будет работать так, как вы хотите
Изменение: (Лучшее понимание того, что вы делаете)
Использование двух таймеров неверно. Просто используйте один таймер и обновите текущую дату и presentTime.
Timer tim = new Timer (5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
presentTime++;
if (presentTime == 24) {
presentTime = 0;
presentDay++;
}
//times how now been set
//update your GUI here
}
}
Посмотрите, помогает ли это, однако, чтобы имитировать использование двух циклов, я использовал алгоритм BubbleSort
. Хотя, как уже было сказано, удаление одиночного цикла while сделает это. Поскольку в этом случае он работает так, как ожидалось, хотя как он будет работать, в случае длинного списка сомнительно. Иначе вы можете посмотреть SwingWorker.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TimerExample {
private JLabel [] labels;
private static final int TOTAL_VALUES = 5;
private static final int GAP = 5;
private JButton startButton;
private JButton stopButton;
private Timer timer;
private int [] values = {
5, 10, 20, 2, 8
};
private int pass;
private int i;
private ActionListener timerActions = new ActionListener () {
@Override
public void actionPerformed ( ActionEvent ae ) {
if ( pass <= TOTAL_VALUES - 1 ) {
System.out.println ( "Pass: " + pass );
for ( int i = 0; i <= TOTAL_VALUES - 1 - pass; ++i ) {
System.out.println ( "i: " + i );
try {
int left = Integer.parseInt ( labels [ i ].getText () );
int right = Integer.parseInt ( labels [ i + 1 ].getText () );
System.out.println ( "[ " + i + " ] " + left + " [ " + ( i + 1 ) + " ] " + right );
if ( left > right ) {
String value = labels [ i ].getText ();
labels [ i ].setText ( labels [ i + 1 ].getText () );
labels [ i + 1 ].setText ( value );
}
} catch ( Exception ex ) {
ex.printStackTrace ();
}
}
++pass;
}
}
};
public TimerExample () {
pass = 1;
i = 0;
}
private void displayGUI () {
JFrame frame = new JFrame ( "" );
frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
JPanel contentPane = new JPanel ();
contentPane.setLayout ( new BorderLayout ( GAP, GAP ) );
JPanel topPanel = new JPanel ();
createLabels ( topPanel );
contentPane.add ( topPanel, BorderLayout.CENTER );
JPanel bottomPanel = new JPanel ();
startButton = new JButton ( "Start" );
startButton.addActionListener ( new ActionListener () {
@Override
public void actionPerformed ( ActionEvent ae ) {
if ( !timer.isRunning () ) {
timer.start ();
}
}
} );
stopButton = new JButton ( "Stop" );
stopButton.addActionListener ( new ActionListener () {
@Override
public void actionPerformed ( ActionEvent ae ) {
if ( timer.isRunning () ) {
timer.stop ();
}
}
} );
bottomPanel.add ( startButton );
bottomPanel.add ( stopButton );
contentPane.add ( bottomPanel, BorderLayout.PAGE_END );
frame.setContentPane ( contentPane );
frame.pack ();
frame.setLocationByPlatform ( true );
frame.setVisible ( true );
timer = new Timer ( 1000, timerActions );
}
private void createLabels ( JPanel contentPane ) {
labels = new JLabel [ TOTAL_VALUES ];
for ( int i = 0; i < TOTAL_VALUES; ++i ) {
labels [ i ] = new JLabel ( "" + values [ i ], JLabel.CENTER );
contentPane.add ( labels [ i ] );
}
}
public static void main ( String [] args ) {
Runnable runnable = new Runnable () {
@Override
public void run () {
new TimerExample ().displayGUI ();
}
};
EventQueue.invokeLater ( runnable );
}
}
EachWordUpperCaseClass
общую номенклатуру Java (соглашения об именах - например,EachWordUpperCaseClass
,firstWordLowerCaseMethod()
,firstWordLowerCaseAttribute
если только это неUPPER_CASE_CONSTANT
), и используйте его последовательно.if ( presentDay <= numberOfDays ) { if ( presentTime <= 18 ( ) { DO WHAT YOU DOING, HERE } }
блокиif
, напримерif ( presentDay <= numberOfDays ) { if ( presentTime <= 18 ( ) { DO WHAT YOU DOING, HERE } }
. Это должно работать Поскольку вы вызываете это действие по истечении указанного времени, как описано при инициализации ссылки на объектTimer
.