JColorChooser

Status
Niet open voor verdere reacties.

yougina

Gebruiker
Lid geworden
17 mrt 2009
Berichten
6
Hallo iedereen,

Ben bezig met een applet. Hierin word een afbeelding geladen met een transparante achtergrondkleur. Deze kleur moet gewijzigd kunnen worden. Dat gaat goed. Nu wil ik ook de tekst, die je aan het begin toevoegd, kunt wijzigen, zowel van kleur als de tekst zelf.

Nu als ik de kleur van de tekst, of de tekst zelf aan wil passen, komt de achtergrond van de frame waarin de JColorChooser geladen word, of de dialog waarin je de text invuld ook op de achtergrond van de applet. Ook de tekst blijft eerst staan (met de nieuwe eroverheen).

Wanneer je dan de achtergrondkleur van de applet weer veranderd, staat alles gewoon weer goed (inclusief de gemaakte wijzigingen).

Kan iemand mij helpen?

De volgende code gebruik ik voor het wijzigen van de kleur van de tekst:
[JS]
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class txtColorChooser extends JFrame implements ChangeListener {

protected JColorChooser palette;
private laadSchaftwagen laad;
private Schaftwagens schaft = new Schaftwagens();

public txtColorChooser(laadSchaftwagen laad) {
super("Kies hier de kleur voor de tekst van uw schaftwagen!");
this.laad = laad;
kleurKiezer();
setLocation(450, 0);
}

public void kleurKiezer() {
setSize(500, 500);
setVisible(true);
palette = new JColorChooser();
palette.setColor(laad.getColor());
palette.getSelectionModel().addChangeListener(this);
palette.setBorder(BorderFactory.createTitledBorder("Kies schaftwagen's tekst kleur"));
add(palette);
}

public void stateChanged(ChangeEvent e) {
Color nieuweKleur = palette.getColor();
laad.changeColor(nieuweKleur);
}
}
[/JS]

En dit is waar de tekst en de afbeelding ingeladen worden:
[JS]
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;


public class laadSchaftwagen extends JPanel {

private Image img;
public Color color;
public Graphics2D g2;
public String text;

Schaftwagens schaft;
helpDialog help;
laadSchaftwagen laad;
/**
* De constructor laadSchaftwagen haald de afbeelding op die meegestuurd is vanuit <code>Schaftwagens</code>.
* @param img De img parameter is de afbeelding die meegestuurd is vanuit de klasse <code>Schaftwagens</code>.
*/
public laadSchaftwagen(String img) {
this(new ImageIcon(img).getImage());
}

/**
* De 2<sup>e</sup> constructor laadSchaftwagen regelt de grote, locatie en dimensie van de afbeelding.
* @param img De img parameter is de afbeelding die meegestuurd is vanuit de klasse <code>Schaftwagens</code>.
*/
public laadSchaftwagen(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
}

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

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

public Color getColor() {
return this.color;
}
/**
* Deze laatste methode in de klasse <code>laadSchaftwagen</code> zorgt ervoor dat de afbeelding echt in het frame weergegeven word.
* @param g Deze parameter word aangeduid als classe om de afbeelding in het panel te plaatsen.
*/
public void paintComponent(Graphics gIn) {
gIn.drawImage(img, 0, 0, null);

Graphics2D g2 = (Graphics2D)gIn.create();
g2.setFont(new Font("Serif", Font.BOLD, 20));
g2.rotate(353.0 * Math.PI / 180.0);
g2.setColor(this.color);
try {
g2.drawString(this.text, 110, 180);
} catch (NullPointerException e) {
g2.drawString(" ", 110, 180);
System.err.println("Geen waarde ingevuld! " + e.getMessage());
}
}
}
[/JS]

Ik hoop dat iemand een oplossing voor mij weet?
Alvast bedankt.
 
Probeer dit eens...

Code:
 public void paintComponent(Graphics gIn) {
        super.paintComponent(gln);  // dit zorgt ervoor dat de achtergrond wordt geleegd
        gIn.drawImage(img, 0, 0, null);
        
        Graphics2D g2 = (Graphics2D)gIn.create();
        g2.setFont(new Font("Serif", Font.BOLD, 20));       
        g2.rotate(353.0 * Math.PI / 180.0);
        g2.setColor(this.color);
        try {
            g2.drawString(this.text, 110, 180);
        } catch (NullPointerException e) {
            g2.drawString(" ", 110, 180);
            System.err.println("Geen waarde ingevuld! " + e.getMessage());
        }
    }

ps. die try - catch is erg lelijk.. gebruik liever if (text!=null) g2.drawString(..) else system.err.println(..)
 
in verband met vakantie heb ik hier zolang niet op gereageerd.

zal morgen even naar kijken, bedankt voor je reactie in ieder geval.

Edit:
Heb zojuist toch al even gekeken, het probleem is echter dat ik de achtergrond van de totale applet vanuit een andere classe al aanpas. Door de door u genoemde functie werkt dit echter ook niet meer.

Hier is een voorbeeld van de niet werkende versie:
http://schaftwagen.ncamade.nl/colorchooser.asp

Ook is er dus een derde classe voor gebruikt:
[JS]
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;

/**
* De klasse <code>Schaftwagens</code> start de Applet.
* Belangrijke instanties van <code>Schaftwagens zijn
* <code>ColorChooser</code> en <code>laadSchaftwagen</code>.
*
* @author <b>Christiaan Swiers</b> - <b>NCA</b>
* @version <b>1</b>.3
* @see ColorChooser
* @see laadSchaftwagen
* @see ActionHandler
*/

public class Schaftwagens extends JApplet implements ActionListener {
JToolBar bar = new JToolBar(SwingConstants.VERTICAL);

java.net.URL imgIcon = getClass().getResource("icon.gif");
ImageIcon clr = new ImageIcon(imgIcon);

java.net.URL imgQuestion = getClass().getResource("question.gif");
ImageIcon questionImg = new ImageIcon(imgQuestion);

java.net.URL txtColor = getClass().getResource("txt.gif");
ImageIcon imgTXT = new ImageIcon(txtColor);

JButton kleur = new JButton(clr);
JButton question = new JButton(questionImg);
JButton txtKleur = new JButton(imgTXT);
JButton txtWijzig = new JButton("<html>O<br>p<br>s<br>c<br>h<br>r<br>i<br>f<br>t</html>");

helpDialog help;

java.net.URL imgURL = getClass().getResource("schaftwagen.jpg");
laadSchaftwagen pnl = new laadSchaftwagen(new ImageIcon(imgURL).getImage());



/**
* Dit zorgt voor het laden van de applet. Hier worden alle componenten toegevoegd.
*/
public void init() {
String text = JOptionPane.showInputDialog(this, "Vul naam van uw bedrijf in", "Naam van uw bedrijf", 3);
try {
pnl.text = text;
} catch (NullPointerException e){
pnl.text = "<html>&nbsd; ";
System.err.println("Geen waarde ingevuld!" + e.getMessage());
}
setContentPane(pnl);
Container pane = getContentPane();
BorderLayout border = new BorderLayout();
pane.setLayout(border);
kleur.addActionListener(this);
question.addActionListener(this);
txtKleur.addActionListener(this);
txtWijzig.addActionListener(this);
bar.add(kleur);
bar.add(question);
bar.add(txtKleur);
bar.add(txtWijzig);
bar.setFloatable(false);
bar.setRollover(true);
pane.add(bar, BorderLayout.EAST);
}

public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (e.getSource() == kleur) {
ColorChooser color = new ColorChooser(this);
} else if (e.getSource() == question) {
helpDialog help = new helpDialog();
help.setVisible(true);
} else if (e.getSource() == txtKleur) {
txtColorChooser tcolor = new txtColorChooser(pnl);
} else if (e.getSource() == txtWijzig) {
String text = JOptionPane.showInputDialog(this, "Vul naam van uw bedrijf in", "Naam van uw bedrijf", 3);
try {
pnl.setText(text);
} catch (NullPointerException ex){
pnl.setText("<html>&nbsd; ");
System.err.println("Geen waarde ingevuld!" + ex.getMessage());
}
}
}
}
[/JS]

Ik hoop dat u mij met deze extra informatie en met een extra beeld van de bedoeling mij verder kunt helpen?

Edit:
Nog iets, ik gebruik op het moment 2 monitoren, en als het venster voor het wijzigen van de textkleur geladen word in het venster waar de applet niet in zit, dan werkt het wel goed, wanneer je daarna die venster naar het andere scherm verplaatst (infeite over de applet heen) dan gaat het wel weer fout.
 
Laatst bewerkt:
Volgens mij mis ik nog een stukje code, daar waar je de achtergrond kleur zet.

De applet op de website doet het bij mij goed.. of heb ik zie geen dubbele teksten en kleuren zien er goed uit..
 
[JS]import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class ColorChooser extends JFrame implements ChangeListener {

protected JColorChooser palette;

Schaftwagens schaft;

public ColorChooser(Schaftwagens in) {
super("Kies hier de kleur voor uw schaftwagen!");
schaft = in;
kleurKiezer();
setLocation(450, 0);
}

public void kleurKiezer() {
setSize(500, 500);
setVisible(true);
palette = new JColorChooser();
try {
palette.setColor(schaft.getBackground());
} catch (Exception e) {
System.err.println(e.toString() + "1: " + e.getMessage());
}
palette.getSelectionModel().addChangeListener(this);
palette.setBorder(BorderFactory.createTitledBorder("Kies schaftwagen's kleur"));
add(palette);
}

public void stateChanged(ChangeEvent e) {
Color nieuweKleur = palette.getColor();
try {
schaft.setBackground(nieuweKleur);
} catch (NullPointerException ex) {
System.err.println(ex.toString() + "2: " + ex.getMessage());
}
}
}
[/JS]

Deze code mist u nog..

Hieronder een printscreen van wat ik krijg als ik het uitvoer, op verschillende pc's.

schaftwagenfout.png
 
getest

Edit:
Laat maar, gefixt...


Bedankt voor tijd en moeite in ieder geval :)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan