Liebe Alle,
das ist wahrscheinlich ein Textbuchfall zu "Warum man AWT und Swing nicht mischen soll", vllt. gibt es aber doch einen Ausweg (zumal ich Klassen aus AWT und Swing benötige)?
Ich habe einen JFrame mit einem JPanel in NORTH und einer Canvas-extendenen Instanz in CENTER. Im JPanel befinden sich u.a. JComboBoxen, deren Werte das Rendering im Canvas beeinflussen. Nach jeder neuen Auswahl in den JComboBoxes wird der Canvas repaint()et. Nach dem repaint() allerdings überlagert der Canvas diejenigen Optionen der JComboBoxes, die in ihn "hineinragen".
EDIT: Das Phänomen taucht nur auf, wenn man mit dem JSpinner die Font-Größe ändert.
Kenn jemand von Euch eine Lösung?
Hier der Code:
Danke & Grüße,
B13
das ist wahrscheinlich ein Textbuchfall zu "Warum man AWT und Swing nicht mischen soll", vllt. gibt es aber doch einen Ausweg (zumal ich Klassen aus AWT und Swing benötige)?
Ich habe einen JFrame mit einem JPanel in NORTH und einer Canvas-extendenen Instanz in CENTER. Im JPanel befinden sich u.a. JComboBoxen, deren Werte das Rendering im Canvas beeinflussen. Nach jeder neuen Auswahl in den JComboBoxes wird der Canvas repaint()et. Nach dem repaint() allerdings überlagert der Canvas diejenigen Optionen der JComboBoxes, die in ihn "hineinragen".
EDIT: Das Phänomen taucht nur auf, wenn man mit dem JSpinner die Font-Größe ändert.
Kenn jemand von Euch eine Lösung?
Hier der Code:
Java:
// DevaRender2D.java
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class DevaRender2D extends JFrame implements ItemListener, ChangeListener {
private static CustomCanvas renderingArea;
private static JPanel optionArea;
private JPanel optionReturn, containerPanel;
JComboBox boxRendVal, boxRendQual;
JSpinner spinnerFontSize;
private Object aao, ro;
public static void main(String[] args) {
DevaRender2D dr2d = new DevaRender2D();
dr2d.setLayout(new BorderLayout());
dr2d.setTitle("Devanagari Rendering with the Java 2D API");
dr2d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dr2d.setExtendedState(dr2d.getExtendedState()|JFrame.MAXIMIZED_BOTH);
renderingArea = new CustomCanvas(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT,RenderingHints.VALUE_RENDER_DEFAULT, 20);
optionArea = dr2d.createOptionArea();
dr2d.add(renderingArea,BorderLayout.CENTER);
dr2d.add(optionArea,BorderLayout.NORTH);
dr2d.pack();
dr2d.setVisible(true);
dr2d.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
private JPanel createOptionArea() {
containerPanel = new JPanel(new BorderLayout());
optionReturn = new JPanel(new GridLayout(0,2,5,10));
containerPanel.setBorder(new EmptyBorder(5,50,5,50));
boxRendVal = new JComboBox(new String[] {"DEFAULT", "ON", "OFF", "GASP", "LCD_HRGB", "LCD_HBGR", "LCD_VRGB", "LCD_VBGR"});
boxRendVal.addItemListener(this);
boxRendQual = new JComboBox(new Object[] { "DEFAULT", "SPEED", "QUALITY" });
boxRendQual.addItemListener(this);
spinnerFontSize = new JSpinner(new SpinnerNumberModel(20, 10, 100, 1));
spinnerFontSize.addChangeListener(this);
optionReturn.add(new JLabel("Antialising (RenderingHints.Key.VALUE_TEXT_ANTIALIASING_*)"));
optionReturn.add(boxRendVal);
optionReturn.add(new JLabel("Rendering (RenderingHints.Key.VALUE_RENDER_*)"));
optionReturn.add(boxRendQual);
optionReturn.add(new JLabel("Font size"));
optionReturn.add(spinnerFontSize);
containerPanel.add(optionReturn,BorderLayout.WEST);
return containerPanel;
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
if (e.getSource() == boxRendVal) {
if (boxRendVal.getSelectedItem() == "ON")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
if (boxRendVal.getSelectedItem() == "OFF")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
if (boxRendVal.getSelectedItem() == "DEFAULT")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
if (boxRendVal.getSelectedItem() == "GASP")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_GASP;
if (boxRendVal.getSelectedItem() == "LCD_HRGB")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB;
if (boxRendVal.getSelectedItem() == "LCD_HBGR")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR;
if (boxRendVal.getSelectedItem() == "LCD_VRGB")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB;
if (boxRendVal.getSelectedItem() == "LCD_VBGR")
aao = RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR;
renderingArea.setRh1(aao);
}
if (e.getSource() == boxRendQual) {
if (boxRendQual.getSelectedItem().equals("SPEED")){
ro = RenderingHints.VALUE_RENDER_SPEED;
}
if (boxRendQual.getSelectedItem() == "QUALITY")
ro = RenderingHints.VALUE_RENDER_QUALITY;
if (boxRendQual.getSelectedItem() == "DEFAULT")
ro = RenderingHints.VALUE_RENDER_DEFAULT;
renderingArea.setRh2(ro);
}
renderingArea.repaint();
}
public void stateChanged(ChangeEvent e) {
try {
String size = spinnerFontSize.getModel().getValue().toString();
int sizeChoice = Integer.parseInt(size);
renderingArea.setfS(sizeChoice);
}
catch (NumberFormatException nfe) {}
renderingArea.repaint();
}
} // end class
Java:
// CustomCanvas.java
import java.awt.*;
import java.awt.RenderingHints.Key;
import java.util.HashMap;
public class CustomCanvas extends Canvas {
String str1 = "Ligatur:";
private RenderingHints.Key rk1, rk2;
private HashMap<Key, Object> rhMap;
private Object rh1, rh2;
private int fS;
public CustomCanvas(Object rh1, Object rh2, int fS) {
this.rh1 = rh1;
this.rh2 = rh2;
this.fS = fS;
setRh1(rh1);
setRh2(rh2);
setfS(fS);
} // end constructor
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
renderText(g2);
} // end method paint()
public void renderText(Graphics2D g2) {
g2.setColor(Color.white);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setColor(Color.black);
Font f = new Font(null,Font.PLAIN,getfS());
g2.setFont(f);
int x = 40;
rk1 = RenderingHints.KEY_TEXT_ANTIALIASING;
rk2 = RenderingHints.KEY_RENDERING;
rhMap = new HashMap<Key, Object>();
rhMap.put(rk1, getRh1());
rhMap.put(rk2, getRh2());
g2.setRenderingHints(rhMap);
g2.drawString(str1, 50, x);
g2.drawString(str2, 50, x + (f.getSize() + 20));
g2.drawString(str3, 50, x + (2*(f.getSize() + 20)));
g2.drawString(str4, 50, x + (3*(f.getSize() + 20)));
g2.drawString(str5, 50, x + (4*(f.getSize() + 20)));
g2.drawString(str6, 50, x + (5*(f.getSize() + 20)));
g2.drawString(str7, 50, x + (6*(f.getSize() + 20)));
g2.drawString(str8, 50, x + (7*(f.getSize() + 20)));
g2.drawString("RenderingHints - Antialiasing: " + getRh1(), 50, x + (8*(f.getSize() + 30)));
g2.drawString("RenderingHints - Rendering: " + getRh2(), 50, x + (9*(f.getSize() + 30)));
} // end method renderText()
// Getters & Setters //
...
} // end class
Danke & Grüße,
B13
Zuletzt bearbeitet: