在JFrame上制作网格并填充随机颜色

时间:2016-01-12 22:11:49

标签: java eclipse swing jframe

for(int i = 0; i < sizex/10; i++)
{
    for(int u = 0; u < sizey/10; u++)
    {
        JPanel temp = new JPanel();
        //temp.setSize(10, 10);
        temp.setBounds(i*10,u*10, 10, 10);
        //temp.setLocation(i*10, u*10);
        Random r = new Random();
        int rand = r.nextInt(4-0);
        if(rand == 0)
        {
            temp.setBackground(Color.GREEN);
        }
        else if(rand == 1)
        {
            temp.setBackground(Color.BLUE);
        }
        else if(rand == 2)
        {
            temp.setBackground(Color.RED);
        }
        else if(rand == 3)
        {
            temp.setBackground(Color.MAGENTA);
        }

        frame.add(temp);
    }
}

在我的代码中,它背后的逻辑工作(在我的脑海中),如果我将大小xy除以100并使框100的大小而不是10,则此代码有效

如果它当前在其中,则会生成看似正确尺寸的盒子,但应用程序的侧面只有一些而不是全屏。

以下是该应用的图片:

app

3 个答案:

答案 0 :(得分:4)

你可以......

使用GridLayout ...

Random cells

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class RandomCells {

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

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

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

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridLayout(10, 10, 0, 0));
            Random rnd = new Random();
            Color[] colors = new Color[]{Color.GREEN, Color.BLUE, Color.RED, Color.MAGENTA};
            for (int col = 0; col < 10; col++) {
                for (int row = 0; row < 10; row++) {
                    JPanel cell = new JPanel() {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(10, 10);
                        }
                    };
                    int color = rnd.nextInt(4);
                    cell.setBackground(colors[color]);
                    add(cell);
                }
            }
        }

    }

}

有关详细信息,请参阅How to Use GridLayout

或者你可以......

使用GridBagLayout ...

RandomCells

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class RandomCells {

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

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

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

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            Random rnd = new Random();
            Color[] colors = new Color[]{Color.GREEN, Color.BLUE, Color.RED, Color.MAGENTA};
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridy = 0;
            for (int col = 0; col < 10; col++) {
                gbc.gridx = 0;
                for (int row = 0; row < 10; row++) {
                    JPanel cell = new JPanel() {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(10, 10);
                        }
                    };
                    int color = rnd.nextInt(4);
                    cell.setBackground(colors[color]);
                    add(cell, gbc);
                    gbc.gridx++;
                }
                gbc.gridy++;
            }
        }

    }

}

有关详细信息,请参阅How to Use GridBagLayout

有什么区别?

GridLayout将始终均匀地调整其组件的大小,以便填充可用空间,因此,如果您调整窗口大小,则所有面板都会更改大小以尝试填充可用空间。

GridBagLayout(在我已经显示的配置中)将继续尊重面板的preferredSize,因此当您调整窗口大小时,面板不会改变尺寸< / p>

答案 1 :(得分:2)

您可以在不使用GridLayout的情况下完成此操作,只需重新定义paintComponent组件的JPanel方法并在连续矩形中填充它,如下所示:

http://docs.julialang.org/en/latest/manual/parallel-computing/

以下是用于实现上述图像的代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

@SuppressWarnings("serial")
public class RandomPaint extends JFrame
{
    private JPanel panel;
    private int dx, dy;
    private Random random;
    private Color color;

    public RandomPaint()
    {
        dx = 50;
        dy = 50;
        random = new Random();
        setBounds(100, 100, 500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel()
        {
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                for (int i = 0; i < getHeight(); i = i + dx)
                {
                    for (int j = 0; j < getWidth(); j = j + dy)
                    {
                        color = new Color(random.nextInt(255),
                                random.nextInt(255), random.nextInt(255));
                        g2d.setColor(color);
                        g2d.fillRect(j, i, dx, dy);
                    }
                }
            }
        };
        add(panel);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                }
                catch (ClassNotFoundException | InstantiationException
                        | IllegalAccessException
                        | UnsupportedLookAndFeelException e)
                {
                }
                new RandomPaint();
            }
        });
    }
}

答案 2 :(得分:0)

代码:

    JFrame frame = new JFrame("example");

    frame.setSize(100,100);

    frame.setLayout(new GridLayout(10,10));

    for(int i = 0; i < 100/10; i++)
    {
        for(int u = 0; u < 100/10; u++)
        {
            JPanel temp = new JPanel();

            temp.setBounds(i*10,u*10, 10, 10);


            Random r = new Random();
            int rand = r.nextInt(4-0);

            if(rand == 0)
            {
                temp.setBackground(Color.GREEN);
            }
            else if(rand == 1)
            {
                temp.setBackground(Color.BLUE);
            }
            else if(rand == 2)
            {
                temp.setBackground(Color.RED);
            }
            else if(rand == 3)
            {
                temp.setBackground(Color.MAGENTA);
            }

            frame.add(temp);
        }
    frame.setVisible(true);
    }