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

标签 java swing grid

我正在为网格制作一个计时器,因此网格每 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/

相关文章:

java - 无法使用 SimpleDateFormat 解析日期格式

java - 使用 FetchType.EAGER 时发生 CascadeType.ALL 错误

Java字符串分离

Windows 7 中的 Java swing 最大化

Magento 选择字段禁用相关产品中的行

f# - 格式化乘法表 f# 输出

java - 如何使 JComboBox 中的某些项目不可选择?

java - 在jtable的所有行中导入mysql数据库的最后一行(Java Swing)

java - JButton 在鼠标悬停之前不可见

xamarin - 如何使用具有可绑定(bind)布局的网格(多于一列)