Java изменение цвета формы

#java #swing #colors #paint #graphics2d

#java #swing #Цвет #Краски #graphics2d

Вопрос:

я пытаюсь сделать прямоугольник на Java, готово. Я также могу заполнить его сплошным цветом, готово. Но я хочу на самом деле изменить сплошной цвет самой формы. Я знаю, что с графикой вы можете использовать g.setColor(); но у меня была специальная настройка моего компонента, как показано ниже:

 public class Design extends JComponent {
private static final long serialVersionUID = 1L;

private List<Shape> shapesDraw = new ArrayList<Shape>();
private List<Shape> shapesFill = new ArrayList<Shape>();

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int screenWidth = gd.getDisplayMode().getWidth();
int screenHeight = gd.getDisplayMode().getHeight();

public void paint(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for(Shape s : shapesDraw){
        g2d.draw(s);
    }
    for(Shape s : shapesFill){
        g2d.fill(s);
    }
}

public void drawRect(int xPos, int yPos, int width, int height) {
    shapesDraw.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void fillRect(int xPos, int yPos, int width, int height) {
    shapesFill.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void drawTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesDraw.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}

public void fillTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesFill.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}

public Dimension getPreferredSize() {
    return new Dimension(screenWidth, screenHeight);
}

public int getWidth() {
    return screenWidth;
}
public int getHeight() {
    return screenHeight;
}

}
  

Как вы можете видеть, вместо того, чтобы просто рисовать и заполнять, он использует список для извлечения из этого. Есть ли способ, которым я могу изменить цвет внутри списка <форма>? Я предпочтительно хочу, чтобы цвет был изменяемым внутри каждой фигуры рисования / заливки.

Спасибо за помощь.

Обновлено из ответа:

Мой класс, как следует из вашего примера ShapeWrapper:

 public class Design extends JComponent {
private static final long serialVersionUID = 1L;

private List<ShapeWrapper> shapesDraw = new ArrayList<ShapeWrapper>();
private List<ShapeWrapper> shapesFill = new ArrayList<ShapeWrapper>();

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int screenWidth = gd.getDisplayMode().getWidth();
int screenHeight = gd.getDisplayMode().getHeight();

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for(ShapeWrapper s : shapesDraw){
        g2d.setColor(s.color);
        g2d.draw(s.shape);
    }
    for(ShapeWrapper s : shapesFill){
        g2d.setColor(s.color);
        g2d.fill(s.shape);
    }
}

public void drawRect(int xPos, int yPos, int width, int height) {
    shapesDraw.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void fillRect(int xPos, int yPos, int width, int height) {
    shapesFill.add(new Rectangle(xPos, yPos, width, height));
    repaint();
}

public void drawTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesDraw.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}

public void fillTriangle(int leftX, int topX, int rightX, int leftY, int topY, int rightY) {
    shapesFill.add(new Polygon(
            new int[]{leftX, topX, rightX},
            new int[]{leftY, topY, rightY},
            3));
    repaint();
}


public Dimension getPreferredSize() {
    return new Dimension(getWidth(), getHeight());
}

public int getWidth() {
    return screenWidth;
}
public int getHeight() {
    return screenHeight;
}

}

class ShapeWrapper {

    Color color;
    Shape shape;

    public ShapeWrapper(Color color , Shape shape){
        this.color = color;
        this.shape = shape;
    }
}
  

Теперь я программирую в Eclipse, и все работает нормально, за исключением ОДНОЙ вещи!!
Каждый раз, когда он говорит shapesDraw/ shapesFill.add(), он говорит:

Метод add(ShapeWrapper) в списке типов неприменим для аргументов (прямоугольник)

Так близко! Пожалуйста, ответьте.

Комментарии:

1. getWidth()/ getHeight() должно быть в getPreferredSize()

2. Я использовал его только для того, чтобы мне не нужно было вызывать setBounds(); в JPanel. Это не меняет графику, поэтому все должно быть хорошо, как есть.

Ответ №1:

Вы можете использовать что-то вроде:

 private class ShapeWrapper {

    private Color color;
    private Shape shape;

    public ShapeWrapper(Color color , Shape shape){
        this.color = color;
        this.shape = shape;
    }
}
  

вместо простого Shape для хранения Shape Color .

И нарисуйте их следующим образом :

 public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    for(ShapeWrapper s: shapesDraw){
        g2d.setColor(s.color);
        g2d.draw(s.shape);
    }
    for(ShapeWrappers s : shapesFill){
        g2d.setColor(s.color);
        g2d.fill(s.shape);
    }
}
  

РЕДАКТИРОВАТЬ: согласно вашему исключению, вы пытаетесь добавить в typed list( ShapeWrapper ) объект другого класса ( Shape ), исправьте свои методы следующим образом :

 public void drawRect(int xPos, int yPos, int width, int height) {
    ShapeWrapper wr = new ShapeWrapper(Color.RED,new Rectangle(xPos, yPos, width, height));
    shapesDraw.add(wr);
    repaint();
}
  

Комментарии:

1. Спасибо за ввод, я точно понимаю, что вы имеете в виду, но чего я пытаюсь добиться, так это того, что вы можете иметь отдельные фигуры с разными цветами, т. Е. 2 заполненных треугольника, один красный, один синий, что в настоящее время произойдет, так это то, что оба будут одного цвета.

2. @Sk4llsRPG: ShapeWrapper shape1 построен в виде красного треугольника. ShapeWrapper shape2 построен в виде синего треугольника. Добавьте оба в список<ShapeWrapper> .

3. Теперь это говорит мне следующее: метод add(Shape) в списке типов<Shape> неприменим для аргументов (ShapeWrapper)

4. Кажется, вы используете List<Shape> вместо List<ShapeWrapper> shapesDraw as в своем редактировании.

5. Не знаю, почему я никогда не принимал ваш ответ… Еще раз спасибо, проект стал намного лучше благодаря вашей помощи.