在简单的Swing程序中将正方形更改为矩形

时间:2011-03-02 15:55:17

标签: java swing awt draw shapes

我遇到的问题可能是Java中一个非常简单的问题。我编写了以下程序,显示一个10x10的正方形颜色矩阵,其颜色是随机生成的,并在用户点击窗口时随机更改。但是,如果我想将这些方块更改为矩形,或者任何其他形状,我该怎么做呢?鉴于我现有的代码,它甚至可能吗?非常感谢你的帮助 - 对于糟糕的代码缩进感到抱歉!

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ColorGrid extends JLabel {

    private static final int n = 10;
    private static final Random random = new Random();

    public ColorGrid() {
        this.setOpaque(true);
        this.setBackground(new Color(random.nextInt()));
        this.setPreferredSize(new Dimension(50, 50));
    }

    private void GridOutput() {
        JFrame f = new JFrame("ColorGrid Display Window");
        f.setLayout(new GridLayout(n, n));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 0; i < n * n; i++) {
            final ColorGrid label = new ColorGrid();
            label.addMouseListener(new MouseAdapter() {

                public void mousePressed(MouseEvent e) {
                    label.setBackground(new Color(random.nextInt()));
                }
            });
            f.add(label);
        }
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                new ColorGrid().GridOutput();
            }
        });
    }
}

3 个答案:

答案 0 :(得分:2)

根据建议here,只需更改标签的首选大小:

this.setPreferredSize(new Dimension(64, 48));

附录:

  

任何其他形状

为了方便JComponent 绘制不同形状所需的多功能性,一种方法是实现Icon接口,如example所述}

答案 1 :(得分:1)

你不是真的在画一个矩形,你只是设置一个标签的背景。我建议更改ColorGrid项以覆盖paintComponent,以便绘制正确的形状和颜色。该对象还必须保持形状和颜色状态,并像现在一样响应鼠标点击。

答案 2 :(得分:0)

您使用的GridLayout默认情况下应该尝试填充整个帧,因此如果添加10x10标签,则应调整它们的大小以填充网格单元格。

但是,您可能不需要设置preferredSize,因为这可能导致标签的大小最多为50x50(取决于布局管理器,我个人经常不使用GridLayout)。