【问题标题】:Change color of jpanels after their creation创建后更改 jpanels 的颜色
【发布时间】:2014-03-16 14:12:56
【问题描述】:

我正在尝试制作一个 GUI 迷宫游戏,当计算机尝试解决迷宫时,它会改变它所在的迷宫中点的颜色。迷宫由带有 JPanel (GridLayout) 的 JFrame 组成。网格中是我需要更改颜色的 JPanel。创建它们后,我什至不确定如何访问它们。

我的代码:

public Maze(int length) {

    JFrame frame = new JFrame();
    JPanel panel = new JPanel(new GridLayout(length, length, 5,5));
    panel.setPreferredSize(new Dimension(500, 500));

    for (int i = 0; i < length; i++) {
        for (int j = 0; j < length; j++) {               
            JPanel p2 = new JPanel();
            p2.setBackground(Color.red);           

            panel.add(p2);
        }
    }

    frame.setDefaultCloseOperation(3);
    frame.setTitle("Maze Game");
    frame.setContentPane(panel);
    frame.pack();
    frame.setVisible(true);
}

有没有办法用不同的方法改变p2 的颜色?还是有更好的方法?

【问题讨论】:

    标签: java swing user-interface jpanel


    【解决方案1】:

    如果你有JFrame的裁判,那么你可以这样做。

        int count = 0;
        for (Component comp : frame.getContentPane().getComponents()) {
            System.out.println(comp.getBackground());
            if (count == 6) {
                comp.setBackground(Color.GREEN);
            }
            count++;
        }
    

    这里的 6 代表第 2 行和第 3 列,与 JPanelJFrame 中添加的顺序相同。


    完整示例代码 [已编辑]

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.GridLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    
    public class Maze {
        private JFrame frame = null;
    
        public Maze(int length) {
    
            frame = new JFrame();
    
            JPanel panel = new JPanel(new GridLayout(length, length, 5, 5)) {
                private static final long serialVersionUID = 1L;
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(500, 500);
                }
            };
    
            for (int i = 0; i < length; i++) {
                for (int j = 0; j < length; j++) {
                    JPanel p2 = new JPanel();
                    p2.setBackground(Color.red);
    
                    panel.add(p2);
                }
            }
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setTitle("Maze Game");
            frame.setContentPane(panel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public void setPanelColor(int index) {
            frame.getContentPane().getComponents()[index].setBackground(Color.GREEN);
        }
    
        public static void main(String[] a) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    try {                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (Exception ex) {
                    }
                    Maze maze = new Maze(4);
                    maze.setPanelColor(6);
                }
            });
        }
    }
    

    编辑:

    1. EventQueue.invokeLater()

      java 中所有与 GUI 相关的东西都应该通过一个线程。线程是我们传说中的AWT-EventQueue。因此,所有与 GUI 相关的操作都必须通过 AWT 事件线程。如果不是这样,您可能会陷入僵局

      阅读更多Should we use EventQueue.invokeLater for any GUI update in a Java desktop application?

    2. UIManager.setLookAndFeel()

      UIManager 管理当前的外观和感觉,一组可用的外观和感觉。

      阅读更多How to Set the Look and Feel

    3. JComponent#getPreferredSize()

      阅读更多Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

    【讨论】:

    • 你有JFrame的参考吗?
    • 您可以通过在具有多个方法的类中创建实例或静态成员来访问它。
    • 您应该将主面板作为迷宫的实例变量。不是局部变量,那你可以参考一下。
    • 是的,您是对的,您也可以通过扩展JFrame 并使用this 访问它
    • 扩展 JFrame 确实是一个坏主意,因为您没有向 JFrame 添加任何功能,更喜欢组合而不是继承,并且认为将主 JPanel 而非 jframe 作为实例变量可能会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多