Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[]

baphomet13

Mitglied
Liebe Alle,

wie bekomme ich die RenderingHints.Keys, die vom Typ TEXT_* (also die Keys) sind in einen Array? Und von welchem Type wäre dieser Array? Weiterhin möchte ich einen Object-Array erstellen, aus allen RenderingHints.Keys, die Objekte sind, also VALUE_*.

RenderingHints.Key ist ja eine Klasse, allerdings würde getMethods maximal die Methoden geben, nicht aber die Keys.

Hat jemand einen Hinweis?

Danke & Grüße,
B13
 
Du kannst sie einfach in ein Array speichern. [c]new Object[] { RenderingHints.Key.KEY_RENDERING, ... };[/c] Damit hättest du ein Array von Objects.
[c]getMethods()[/c] - falls damit Reflection gemeint ist - gibt auch Methoden und keine Variablen zurück, dafür bräuchtest du [c]getFields()[/c].
 
Du kannst sie einfach in ein Array speichern. [c]new Object[] { RenderingHints.Key.KEY_RENDERING, ... };[/c] Damit hättest du ein Array von Objects.

Das dachte ich auch, aber Eclipse stöhnt bei

Java:
rhTextAAVals = new Object[] {RenderingHints.Key.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.Key.VALUE_TEXT_ANTIALIAS_OFF};

Code:
VALUE_TEXT_ANTIALIAS_ON cannot be resolved or is not a field

:bahnhof:

Zum Hintergrund: will eine JComboBox damit befüllen und bei itemChanged dann jeweils die RenderingHints anwenden...
 
Zuletzt bearbeitet:
Ah sry, natürlich ohne [c].Key[/c] dazwischen, ist ja [c]static[/c].

Danke, das funktioniert schonmal. Allerdings bekomme ich (sowohl in der JComboBox als auch in einer Testausgabe (s.u.) Textinhalte (String?) zurückgegeben:

Java:
rhTextAAVals = new Object[] {RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF};
boxRendVal = new JComboBox(rhTextAAVals);
boxRendVal.addItemListener(this);
...
 public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() != ItemEvent.SELECTED) {
            return;
        }
        if (e.getSource() == boxRendVal) {
        	renderingArea.setRh1(boxRendVal.getSelectedItem());
        	System.out.println(renderingArea.getRh1());
        }

Code:
// Console Output
Nonantialiased text mode
 
Danke faetzminator,

ich glaube ich war nicht präzise genug. Ich versuche Folgendes zu realisieren (Code unten):
Ich habe einen zweigeteilten JFrame, oben soll es zwei JComboBoxen geben, in denen man den RenderingHints.Key (und zwar einen aus den VALUE_*s) auswählen kann, mit denen ein Text unten dann gerendert werden soll. JComboBox 1 für die KEY_TEXT_ANTIALIASING-Values, JComboBox 2 für die KEY_RENDERING-Values.

Dazu wollte ich:
  1. Die RenderingHints.Keys entsprechend in die JComboBox einlesen (Object[])
  2. per ItemChanged das gewählte Objekt wieder auslesen und in eine Variable speichern
  3. Die RenderingHints des zu rendernden Strings mit Hilfe dieser Variable festlegen, und schließlich
  4. den Canvas mit dem String repaint()en.

Eigentlich wollte ich vermeiden, die Umwandlung in der ItemChanged-Methode per Hand zu machen (der Eleganz wegen), aber vielleicht gibt es dafür dann doch keine andere Lösung. Ich lasse mich aber natürlich sehr gern eines Besseren belehren.

Hier ist der Code der beiden Klassen:
Java:
// DevaRender2D.java

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class DevaRender2D extends JFrame implements ItemListener {
	
	private static CustomCanvas renderingArea;
	private static JPanel optionArea;
	private JPanel optionReturn;
	JComboBox boxRendVal, boxRendQual, boxFontSize;
	private Object[] rhTextAAVals, rhRendVals; 
	
	public static void main(String[] args) {
			DevaRender2D dr2d = new DevaRender2D();
			dr2d.setLayout(new BorderLayout());
			dr2d.setTitle("Rendering with the Java 2D API");
	        dr2d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        dr2d.setExtendedState(dr2d.getExtendedState()|JFrame.MAXIMIZED_BOTH);
	        renderingArea = new CustomCanvas();
	        optionArea = dr2d.createOptionArea();
	        dr2d.add(optionArea,BorderLayout.NORTH);
	        dr2d.add(renderingArea,BorderLayout.CENTER);
	        dr2d.pack();
			dr2d.setVisible(true);
			dr2d.setExtendedState(JFrame.MAXIMIZED_BOTH); 
	}

	private JPanel createOptionArea() {
		optionReturn = new JPanel();
		rhTextAAVals = new Object[] {RenderingHints.VALUE_TEXT_ANTIALIAS_ON, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF};
		boxRendVal = new JComboBox(rhTextAAVals);
		boxRendVal.addItemListener(this);
		rhRendVals = new Object[] {RenderingHints.VALUE_RENDER_SPEED, RenderingHints.VALUE_RENDER_QUALITY, RenderingHints.VALUE_RENDER_DEFAULT };
		boxRendQual = new JComboBox(rhRendVals);
		optionReturn.add(boxRendVal);
		optionReturn.add(boxRendQual);
		return optionReturn;
	}
	
    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() != ItemEvent.SELECTED) {
            return;
        }
        if (e.getSource() == boxRendVal) {
        	renderingArea.setRh1(boxRendVal.getSelectedItem()); 
        	System.out.println(renderingArea.getRh1());
        } 
        if (e.getSource() == boxRendQual) {
            renderingArea.setRh2(boxRendQual.getSelectedItem());
        }
        renderingArea.repaint();
    }

		
} // end class

Java:
// CustomCanvas.java
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

public class CustomCanvas extends Canvas {

	String str1 = "\u0932";
	private RenderingHints.Key rk1, rk2;
	private Object rh1, rh2;

	public CustomCanvas() {
		// TODO Auto-generated constructor stub
	}

	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		renderText(g2, getRh1(), getRh2());
		}

         /**
	 * @return the rh1
	 */
	public Object getRh1() {
		return rh1;
	}

	/**
	 * @param rh1 the rh1 to set
	 */
	public void setRh1(Object rh1) {
		this.rh1 = rh1;
	}

	/**
	 * @return the rh2
	 */
	public Object getRh2() {
		return rh2;
	}

	/**
	 * @param rh2 the rh2 to set
	 */
	public void setRh2(Object rh2) {
		this.rh2 = rh2;
	}

public void renderText(Graphics2D g2, Object rh1, Object rh2) {
    g2.setColor(Color.white);
    g2.fillRect(0, 0, getWidth(), getHeight());
	g2.setColor(Color.black);
	Font f = new Font(null,Font.ROMAN_BASELINE,20);
	g2.setFont(f);
    int y = 80;
    rk1 = RenderingHints.KEY_TEXT_ANTIALIASING;
    this.rh1 = rh1;
    rk2 = RenderingHints.KEY_RENDERING;
    this.rh2 = rh2;
    RenderingHints rh = new RenderingHints(null);
    rh.put(rk1, getRh1());
    rh.put(rk2, getRh2());
    g2.setRenderingHints(rh);
    g2.drawString(str1, 50, y);
}
	
} // end class

Danke & Grüße,
B13
 
Nunja, das *sollte* eigentlich funktionieren, denn immerhin gibt [c]getSelectedItem()[/c] ein Object zurück. Da ich aber nicht ein grossartiger Swing-User bin, kann ich dir da nicht weiterhelfen. Arbeite mit dem Debugger in der IDE, schau dir an, was in der ursprünglichen Variable stand (und von was für einem Typen sie ist) und was dann in [c]itemStateChanged()[/c] von den jeweiligen Methoden zurückgegeben wird.
 
Hab's jetzt gelöst, indem ich die JComboBoxes mit String[]s gefüllt habe und eine kurze if-Abfrage für jede Option in die ItemChanged Methode aufgenommen habe, die dann den entsprechenden RenderingHint.Key in eine Variable settet.

Trotzdem bleibt die Frage (wenn auch nicht der Thread) natürlich offen. Ich bekomme (auch in der JComboBox) einen String angezeigt, der so etwas wie die Meta-Information zum jeweiligen Key ist, z.B. "Nonantialiased text mode" und der sich auch per drawString() darstellen lässt... Sollte sich hier jemand besser auskennen, bitte gerne Thread wiedereröffnen und Infos teilen. Danke!
 
Zuletzt bearbeitet:

Zurück
Oben