如何仅填充圆角矩形的颜色并将其保存在 Java 中的 var 中

How to only fill the color of a rounded rectangle and keep it in a var in Java

我正在处理我的程序的界面,我最近才能够画出我想要的东西。我有一定数量的圆角矩形,每个圆角矩形的中间都有一个数字,但我无法弄清楚如何让这些矩形填充某种颜色和现在的边框线。除此之外,我需要将每个矩形存储在一个 var 中,以便能够更改矩形的颜色。到目前为止,这是我的代码:

package game;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JPanel;

public class GameNumView extends JPanel
{
    //Nombres affiché
    String[] Numbers;

    public GameNumView(int pWidth, int pHeight)
    {
        //Change ajuste la grosseur du panel
        this.setPreferredSize(new Dimension(pWidth, pHeight));

        //Crée le tableau des strings
        Numbers = new String[]{};
    }

    @Override
    public void paintComponent(Graphics g)
    {
        //Repain avec la super class
        super.paintComponent(g);

        //Calcule les dimensions qui seront utilisé
        int rectSpace = 5;
        int rectWidth = getWidth()/Numbers.length-rectSpace*2;
        int rectHeight = getHeight()-rectSpace*2;
        int arcRect = 15;

        int fontSize = 60;
        int textX = rectWidth/2 - fontSize/4 - rectSpace;
        int textY = rectHeight/2 + fontSize/2 - rectSpace;

        //Change al font
        g.setFont(new Font("TimesRoman", Font.PLAIN, fontSize));

        //Dessine un rounded rectangle avec le nombre pour chaque chiffre du tableau
        for(int i =0; i < Numbers.length; i++)
        {
            g.setColor(Color.red);
            g.drawRoundRect(rectSpace + i*(rectWidth + rectSpace*2), rectSpace, rectWidth, rectHeight, arcRect, arcRect);
            g.setColor(Color.black); 
            g.drawString(Numbers[i], rectSpace + textX + i*(rectWidth + rectSpace*2), textY + rectSpace);
        }
    }

    public void setNumbers(String[] pNumbers)
    {
        //Stock les numbres choisis
        Numbers = pNumbers;
    }

    public void changeColor(Color pColor)
    {
        //Change the background color
    }
}

可能不是最干净的方法,但您可以创建一个新的 class,它有一个只绘制所需形状的方法。此 class 实例的 ArrayList、一些 getter 和 setter 以及所有变量的问题都已解决。构造函数的参数将是 xywidthheightcolortextfont。设置相应的变量并使用 draw() 方法(绘制 "shape" 的方法)中的 getter。为了证明这个概念:下面是一个使用您的代码的示例 - 第二个矩形将是红色的,因为我们调用 rectangles.get(1).setColor(Color.RED);。 - 您可以使用设置器对任何实例执行类似的操作。我认为代码中的其他所有内容都是不言自明的,除了文本的居中...这只是反复试验,TBH :D

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Example extends JPanel {

    String[] numbers;
    ArrayList<RoundedRectangle> rectangles = new ArrayList<RoundedRectangle>();

    public Example() {
        numbers = new String[] { "12", "3", "5" };
        for (int i = 0; i < numbers.length; i++) {
            RoundedRectangle rr = new RoundedRectangle(100 + i * 100, 100, 50, 50, Color.BLUE, numbers[i],
                    new Font(Font.SANS_SERIF, Font.PLAIN, 25));
            rectangles.add(rr);
        }
        rectangles.get(1).setColor(Color.RED);
        System.out.println(rectangles.get(1).getColor());
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (int i = 0; i < rectangles.size(); i++) {
            rectangles.get(i).draw(g2);
        }
    }

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setContentPane(new Example());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);

    }

    public class RoundedRectangle {

        int x;
        int y;
        int width;
        int height;
        Color color;
        String text;
        Font font;

        public RoundedRectangle(int x, int y, int width, int height, Color color, String text, Font font) {

            setX(x);
            setY(y);
            setWidth(width);
            setHeight(height);
            setColor(color);
            setText(text);
            setFont(font);

        }

        public void draw(Graphics2D g2) {

            g2.setColor(getColor());
            g2.drawRoundRect(x, y, width, height, 15, 15);

            g2.setColor(Color.BLACK);
            FontMetrics metrics = g2.getFontMetrics(getFont());
            int width = metrics.stringWidth(getText());
            int height = metrics.getHeight() - metrics.getAscent();
            g2.setFont(getFont());
            g2.drawString(getText(), getX() + getWidth() / 2 - width / 2, getY() + getHeight() / 2 + height);

        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) {
            this.color = color;
        }

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public Font getFont() {
            return font;
        }

        public void setFont(Font font) {
            this.font = font;
        }

    }

}