如何仅填充圆角矩形的颜色并将其保存在 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 以及所有变量的问题都已解决。构造函数的参数将是 x
、y
、width
、height
、color
、text
和 font
。设置相应的变量并使用 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;
}
}
}
我正在处理我的程序的界面,我最近才能够画出我想要的东西。我有一定数量的圆角矩形,每个圆角矩形的中间都有一个数字,但我无法弄清楚如何让这些矩形填充某种颜色和现在的边框线。除此之外,我需要将每个矩形存储在一个 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 以及所有变量的问题都已解决。构造函数的参数将是 x
、y
、width
、height
、color
、text
和 font
。设置相应的变量并使用 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;
}
}
}