Changer un Composite Graphics g couleur de dessin de la ligne de
j'ai un programme semblable à la peinture. et que je suis en train de mettre en œuvre un changement de couleur de stylo cependant lorsque je change la couleur, tout ce qu'ils sont actuellement conçus, est modifié à la couleur ROUGE par exemple dans mon programme,comment puis-je faire en sorte qu'il ne sera pas repeindre tout attirés actuellement changé de couleur?Ci-dessous le code de compiler et d'exécuter
Classe pour le Composite de la zone de dessin
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
//refer to http://jkost.ergoway.gr/jnkjavaconnection/freedraw.html for the algorithm.
public class STDrawingArea extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
ArrayList<Rectangle> dPoint = new ArrayList<Rectangle>();
Point point = new Point(-1,-1);
private Color currentColor;
public STDrawingArea()
{
setBorder(BorderFactory.createLineBorder(Color.black));
setBackground(Color.WHITE);
addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e)
{
dPoint.add(new Rectangle(point.x,point.y,e.getX(),e.getY()));
point.x = e.getX();
point.y = e.getY();
repaint();
}
});
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e)
{
System.out.println("mousePressed X: "+e.getX()+"mousePressed Y: "+e.getY());
dPoint.add(new Rectangle(e.getX(),e.getY(),-1,-1));
point.x = e.getX();
point.y = e.getY();
}
});
addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent e)
{
System.out.println("mouseReleased X: "+e.getX()+"mouseReleased Y: "+e.getY());
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(700,500);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(getCurrentColor());
for (int i=0; i < dPoint.size(); i++) {
Rectangle r = dPoint.get(i);
if (r.width != -1)
{
g.drawLine(r.x, r.y, r.width, r.height);
}
}
/* Draw current point.*/
g.drawLine(point.x, point.y, point.x, point.y);
}
//set current drawing color
public void changePenColor(Color color)
{
if (color == null)
setCurrentColor(Color.BLACK);
else
setCurrentColor(color);
}
//clear drawings method
public void clearDrawings()
{
if(!(dPoint==null))
{
dPoint.clear();
repaint();
}
}
private void setCurrentColor(Color currentColor) {
this.currentColor = currentColor;
}
private Color getCurrentColor() {
return currentColor;
}
}
Test de la classe principale.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class STTestMain extends JFrame {
STDrawingArea drawingArea = new STDrawingArea();
public STTestMain()
{
//JFrame settings
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Spelling Trainer");
setResizable(false);
setVisible(true);
//Panel of buttons
JPanel buttonContainer = new JPanel();
JButton btnPenColor = new JButton("Red Pen");
buttonContainer.add(btnPenColor);
//Drawing Area instantiation
//Adding things to JFrame
getContentPane().add(drawingArea);
getContentPane().add(buttonContainer,BorderLayout.PAGE_END);
pack();
//button listener
btnPenColor.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//TODO Auto-generated method stub
drawingArea.changePenColor(Color.RED);
}
});
}
public static void main(String args[])
{
STTestMain test = new STTestMain();
}
}
OriginalL'auteur sutoL | 2011-05-24
Vous devez vous connecter pour publier un commentaire.
:
MODIFIER
Vous avez mentionné dans un commentaire que vous n'êtes pas familier avec BufferedImage, et sont à la recherche d'une autre façon. Je suppose que vous pourriez créer une classe qui contient une liste de tableaux de Points avec une Couleur, puis sur chaque mouseReleased créer un objet de cette classe et de l'ajouter à une liste de tableaux dans votre fenêtre de dessin. Ensuite, votre méthode paintComponent pourrait parcourir cette liste de tableaux, du dessin, de la liste des Points avec leur couleur associée, mais mon instinct me dit que vous êtes un gars intelligent et que vous auriez pick up sur la façon d'utiliser un BufferedImage en un rien de temps. Je pense vraiment que c'est la meilleure solution. Et si vous l'essayez et flops, montre-nous ton code, et nous allons probablement être en mesure de vous aider.
EDIT 2
Le BufferedImage constructeur aura besoin de l'image de largeur, de hauteur et d'un type d'image -- quelque chose que je ne suis pas à 100% familier avec. J'ai l'habitude d'utiliser BufferedImage.TYPE_INT_RGB pour objectif général de dessin, et BufferedImage.TYPE_INT_ARGB pour usage général qui a besoin d'un alpha. Ensuite, vous pouvez extraire un objet Graphique de la BufferedImage, dire getGraphics() si vous avez besoin d'un objet Graphique et non pas un objet Graphics2D. Ensuite, lors de l'initialisation de la BufferedImage dans votre constructeur, de le remplir avec une Couleur.blanc, tout comme vous pour votre Composite. Puis les disposer de l'objet Graphics. Ensuite, chaque fois que vous voulez dessiner, vous getGraphics, dessiner, exactement comme dans la méthode paintComponent, disposer de la carte Graphique quand c'est fait, et finalement faire le BufferedImage dans le paintComponent via la méthode drawImage.
MODIFIER 3
Exemple de programme qui n'est pas tout à fait ce que vous essayez de faire, mais ne illustrent l'utilisation d'un BufferedImage avec le dessin. Ce programme modifie la couleur à chaque fois qu'un nouveau chemin d'accès ou courbe est dessinée.
veuillez voir Modifier dans ma réponse ci-dessus.
j'ai lu que le bufferedImage constructeur prendra dans un type d'image? cependant, ma Composite dessins ne sont pas des images, c'est juste le dessin des lignes à main levée, comment ce lien
Le BufferedImage constructeur aura besoin de l'image de largeur, de hauteur et d'un type d'image -- quelque chose que je ne suis pas à 100% familier avec. J'ai l'habitude d'utiliser BufferedImage.TYPE_INT_RGB pour objectif général de dessin, et BufferedImage.TYPE_INT_ARGB pour usage général qui a besoin d'un alpha.
J'ai posté un exemple de code utilisant BufferedImage. Espérons que cela aide.
OriginalL'auteur Hovercraft Full Of Eels
La Peinture Custom Approches donne deux idées sur comment vous pouvez le faire.
OriginalL'auteur camickr
Grâce aéroglisseur, je l'ai fait en regardant votre code et de bidouiller lol.
classe principale
OriginalL'auteur sutoL