创建jpanels后更改其颜色 - java

我正在尝试制作一个GUI迷宫游戏,在计算机尝试解决迷宫的过程中,它会更改迷宫所在位置的颜色。迷宫由带有JPanel(网格布局)的JFrame组成。在网格中是我需要更改其颜色的JPanels。创建它们后,我不确定如何访问它们。

我的代码:

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大神给出的解决方案

如果您有JFrame的裁判,则可以通过这种方式进行。

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

这里的6代表第二行和第三列,与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);
            }
        });
    }
}

编辑:

EventQueue.invokeLater()

Java中所有与GUI相关的事物都应始终通过单个线程。该线程是我们传奇的AWT-EventQueue。因此,所有与GUI相关的操作都必须经过AWT事件线程。如果不是这样,您可能会陷入僵局。

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

UIManager管理当前的外观和可用的外观集。

阅读更多How to Set the Look and Feel
JComponent#getPreferredSize()

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

Java Swing SearchBox模型 - java

我需要使用Java Swing的搜索框,如果单击任何建议,当输入字母时它将显示来自数据库的建议,它将执行一些操作。如果有可能在Java swing中,请提供源代码提前致谢 java大神给出的解决方案 您可以使用DefaultComboBoxModel,输出将是这样。Try this在此代码中,您将找到countries数组,因此您需要从数据库中获取此数组。

Swing-典型桌面应用程序中的并发 - java

这可能是一个广泛的问题,但我想知道单用户桌面应用程序通常在何处使用并发。您如何发现理想情况下(在设计阶段)并发问题?附注:从操作系统理论上来说,并发问题通常发生在无法共享资源(例如打印机)的情况下。不过,我仍然对在编程级别上可能发生的情况感到迷惑。 java大神给出的解决方案 Event Dispatch thread与其他逻辑之间的Swing中可能存在线程…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

如何使用BorderLayout(Java)扩展JTextField - java

我有一个Java程序,其中使用的是JTextField,但如果我未指定默认大小,则其宽度为0。我将其插入BorderLayout中,因此如何制作它展开以填充整个容器? java大神给出的解决方案 在上面的示例中,文本字段将正常工作。但是,如果您插入EAST或WEST,则将不起作用。import java.awt.BorderLayout; import ja…