Обновите графический цвет с помощью кнопки - PullRequest
1 голос
/ 09 ноября 2011

Я пытаюсь обновить цвета некоторых линий и линий, которые нарисованы при построении рамки. Затем я хочу изменить цвет с помощью кнопки на рамке.

package animation.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GraphDisplayTest extends JFrame {

static GraphDisplayTest gui;

private JButton changeColorBtn = new JButton("Change Color");
private Graphics2D g2;
private Ellipse2D e1;
private Ellipse2D e2;
private Ellipse2D e3;
private Ellipse2D e4;
int x = 50, y = 50, w = 20, h = 20;

public static void main(String[] args) {
    gui = new GraphDisplayTest();
    gui.launch();

}

public void launch(){
    gui.setLayout(new BorderLayout());
    gui.add(changeColorBtn, BorderLayout.SOUTH);

    changeColorBtn.addActionListener(new ChangeColor());

    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setTitle("Graph Display Example");
    gui.setSize(350, 400);
    gui.setVisible(true);
}

public class ChangeColor implements ActionListener{
    public void actionPerformed(ActionEvent e){

    //HERE IS THE PROBLEM - the colors are not being reset
        g2.setPaint(Color.BLACK);
        g2.fill(e1);
        g2.drawLine(x+10, y+10, x+210, y+10);
        g2.setColor(Color.WHITE);
    }
}


public void paint(Graphics g) {
    g2 = (Graphics2D)g;
    g2.drawLine(x+10, y+10, x+210, y+10);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+210, y+10, x+210, y+210);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+10, y+210, x+210, y+210);
    g2.setColor(Color.BLACK);
    g2.drawLine(x+10, y+10, x+10, y+210);
    g2.setColor(Color.BLACK);

    e1 = new Ellipse2D.Double(x, y, w, h);
    g2.setPaint(Color.BLUE);
    g2.fill(e1);
    e2 = new Ellipse2D.Double(x+200, y, w, h);
    g2.setPaint(Color.RED);
    g2.fill(e2);
    e3 = new Ellipse2D.Double(x, y+200, w, h);
    g2.setPaint(Color.GREEN);
    g2.fill(e3);
    e4 = new Ellipse2D.Double(x+200, y+200, w, h);
    g2.setPaint(Color.YELLOW);
    g2.fill(e4);

}


}

Я начал там, где понятия не имею, что делать! Кто-нибудь может помочь?!?!

Большое спасибо заранее Джош

Ответы [ 4 ]

2 голосов
/ 09 ноября 2011

каждый раз, когда вызывается краска, вы перезаписываете старую графику с информацией о цвете

лучше добавить цвет поля, инициализированный для Color.BLACK, который вы используете внутри краски, и обновить его внутри actionPerformed слушателя

на другой заметке сохранять графику и использовать ее вне "события" рисования не рекомендуется

1 голос
/ 09 ноября 2011

Не сохранять значение объекта Graphics (в данном случае: g2).

Создать новый атрибут для хранения цвета e1:

Color c = Color.BLUE;

Удалить весь код вactionPerformed(...) и установите значение c в новый цвет.Затем вызовите repaint().

c = Color.BLACK;
repaint();

В paint(...) измените строки:

g2.setPaint(Color.BLUE);
g2.fill(e1);

на:

g2.setPaint(c);
g2.fill(e1);
1 голос
/ 09 ноября 2011

Графический объект, который вы используете в ActionListener, уже находится на экране.Опираясь на это не будет работать.Что вам нужно сделать, так это удержать поле, в котором вы отслеживаете цвет (*).И когда слушатель действия запустится, установите цвет по своему желанию и затем вызовите repaint().Это метод JFrame, который заставит окно перерисоваться, что вызовет написанное вами paint(Graphics g).Внутри этого метода проверьте цвет, который вы держите (так же, как я отмечен звездочкой *).В зависимости от цвета установите цвет графического объекта, а затем нарисуйте.

1 голос
/ 09 ноября 2011

Графический объект только вносит реальные изменения в метод рисования. Так что сохранение объекта Graphics (в вашем случае g2) бесполезно. Вместо этого поместите цвет в переменную и измените цвет во время нажатия кнопки. Используйте в методе рисования переменную цвета, чтобы он перекрашивался в новый цвет при следующем вызове краски.

Может быть, вам также нужно позвонить repaint(). Это заставляет поток awt сделать новый вызов рисовать.

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