Замена квадратов на прямоугольники в простой программе Swing - PullRequest
2 голосов
/ 02 марта 2011

У меня проблемы с тем, что, вероятно, очень простая проблема в Java. Я написал следующую программу, которая отображает цветовую матрицу квадратов 10х10, цвета которой генерируются случайным образом и изменяются случайным образом при нажатии пользователем в окне. Однако, если бы я хотел изменить эти квадраты, например, на прямоугольники или любую другую форму, как я мог бы это сделать? Возможно ли это, учитывая текущий код, который у меня есть? Большое спасибо за любую помощь - извините за плохой отступ кода!

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 ]

2 голосов
/ 02 марта 2011

Как предлагается здесь , просто измените предпочтительный размер этикетки:

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

Добавление:

любая другая форма

Одним из способов получения JComponent и универсальности, необходимой для рисования различных фигур, является реализация интерфейса Icon, как предлагается в этом примере

1 голос
/ 02 марта 2011

Вы на самом деле не рисуете прямоугольник, вы просто устанавливаете фон метки. Я бы предложил изменить элемент ColorGrid так, чтобы он переопределял paintComponent, чтобы нарисовать правильную форму и цвет. Этот объект также должен был бы поддерживать форму и цветовые состояния и реагировать на щелчки мыши, как вы делаете сейчас.

0 голосов
/ 02 марта 2011

Вы используете GridLayout, который по умолчанию должен пытаться заполнить весь кадр, поэтому, если вы добавите метки 10x10, их размер нужно будет изменить, чтобы заполнить ячейки сетки.

Однако вам может не потребоваться устанавливать предпочитаемый размер, поскольку это может привести к тому, что размер меток будет не более 50х50 (зависит от менеджера компоновки, и я лично не часто использовал GridLayout).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...