gpt4 book ai didi

java - 如何在网格java中实现计时器

转载 作者:行者123 更新时间:2023-11-30 07:41:16 25 4
gpt4 key购买 nike

我正在为网格制作一个计时器,因此网格每 5 分钟就会填充一整列,但当我声明计时器时,它对我不起作用。有没有一种方法可以用计时器显示网格并看到网格列每次都被填充

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Timer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.MatteBorder;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class TestGrid02 {

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

public TestGrid02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.revalidate();
frame.repaint();
//frame.remove(0);
}
});
}

public class TestPane extends JPanel {
// Timer timer = new Timer(500, new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
//
// setLayout(new GridBagLayout());
// GridBagConstraints gbc = new GridBagConstraints();
// for (int row = 0; row < 70; row++) {
// for (int col = 0; col < 60; col++) {
// gbc.gridx = col;
// gbc.gridy = row;
// int i = 0;
//
// CellPane cellPane = new CellPane();
// Border border = null;
// if (row < 1) {
// if (col < 1) {
// border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
// } else {
// border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
// }
// } else {
// if (col < 1) {
// border = new MatteBorder(1, 1, 1, 0, Color.RED);
// } else {
// border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
// }
// }
//
// cellPane.setBorder(border);
// add(cellPane, gbc);
//
// }
// }
// timer.start();
// }
//
// });

public TestPane() {

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();

for(int row = 0; row < 70; row++) {
for (int col = 0; col < 60; col++) {
gbc.gridx = col;
gbc.gridy = row;
int i = 0;

CellPane cellPane = new CellPane();
Border border = null;

if (row < col) {
if (col < row) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.RED);
}
} else {
if (col < row) {
border = new MatteBorder(1, 1, 1, 0, Color.RED);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}
}

i++;
cellPane.setBorder(border);
add(cellPane, gbc);

}
}

}
};

//
// public class TestPane extends JPanel {
// public TestPane() {
// setLayout(new GridBagLayout());
//
// GridBagConstraints gbc = new GridBagConstraints();
// for (int row = 0; row < 70; row++) {
// for (int col = 0; col < 60; col++) {
// gbc.gridx = col;
// gbc.gridy = row;
//
// int increment = 1;
//
// CellPane cellPane = new CellPane();
// Border border = null;
// if (row < 1) {
// if (col < 1) {
//
// border = new MatteBorder(1, 1, 0, 0, Color.RED);
// //increment = increment + 1;
// } else {
//
// border = new MatteBorder(1, 1, 0, 1, Color.RED);
// //increment = increment + 1;
// }
// } else {
// if (col < 1) {
//
// border = new MatteBorder(1, 1, 1, 0, Color.RED);
// //increment = increment + 1;
// } else {
//
// border = new MatteBorder(1, 1, 1, 1, Color.RED);
// //increment = increment + 1;
// }
// }
// cellPane.setBorder(border);
// add(cellPane, gbc);
// }
// }
// }
//
// }

public class CellPane extends JPanel {
private Color defaultBackground;
public CellPane() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}

@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}

@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}

}

最佳答案

简单的答案,不要尝试从头开始重建 UI,而只是更新它。

这个例子简单地创建了一个 ListCellPane ( List<List<CellPane>> ) 按行/列顺序。 Timer然后跟踪当前的rowcol它取决于 Timer 的每个刻度。 ,更新下一个单元格。

现在,此示例将每 5 秒填充一列(用于显示目的),但一次会填充一个单元格。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.MatteBorder;

public class TestGrid02 {

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

public TestGrid02() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//frame.remove(0);
}
});
}

public class TestPane extends JPanel {

private List<List<CellPane>> grid = new ArrayList<>(70 * 60);

public TestPane() {

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();

grid = new ArrayList<>(70);

for (int row = 0; row < 70; row++) {
List<CellPane> cols = new ArrayList<>(60);
for (int col = 0; col < 60; col++) {
gbc.gridx = col;
gbc.gridy = row;
int i = 0;

CellPane cellPane = new CellPane();
cols.add(cellPane);
Border border = null;

if (row < col) {
if (col < row) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.RED);
}
} else if (col < row) {
border = new MatteBorder(1, 1, 1, 0, Color.RED);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}

i++;
cellPane.setBorder(border);
add(cellPane, gbc);

}
grid.add(cols);
}

Timer timer = new Timer(5000 / 70, new ActionListener() {
private int row = 0;
private int col = 0;
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("...");
CellPane cl = grid.get(row).get(col);
cl.setBackground(Color.RED);

row++;
if (row >= 70) {
row = 0;
col++;
if (col >= 60) {
((Timer)e.getSource()).stop();
}
}
}
});
timer.start();
}
}

public class CellPane extends JPanel {

private Color defaultBackground;

public CellPane() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}

@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}

@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}

}

如果您想在 Timer 的每个刻度处填充整列,您只需要跟踪当前列(在每个刻度上递增它)并循环遍历 List 的每一行。并更新相应列内的单元格

类似...

Timer timer = new Timer(5000 / 70, new ActionListener() {
private int col = 0;

@Override
public void actionPerformed(ActionEvent e) {
for (int row = 0; row < 70; row++) {
CellPane cl = grid.get(row).get(col);
cl.setBackground(Color.RED);
}
col++;
if (col >= 60) {
((Timer) e.getSource()).stop();
}
}
});

例如...

关于java - 如何在网格java中实现计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com