Hallo Leute,
ich hab hab grad einen Text-Editor gebastelt. Das heißt, es gibt eine JTextArea mit dem Text, 4 Buttons für Fett, Kursiv, Unter- und Durchgestrichen und zwei JComboBoxen, eine ist Editable und für die Größe des Text verantwortlich, die andere enthält alle verfügbaren Font-Namen. Nun versuche ich mich (zuerst nur an der JComboBox mit den Font-Namen) daran, dass, wenn man die JComboBox anklickt und über die Font-Namen fährt, der Text sich automatisch dementsprechend verändert. Also so eine Art Vorschau.
Hier mal der Code, wie ich die ComboBox initialisiere:
Und hier der Renderer:
Also das mit dem Rüberfahren geht sogar schon. Er fragt in
ab, ob diese Komponente selektiert ist. Wenn ja, übernimmt er mit der Methode
den Font-Namen auf den Font in der JTextArea, Wenn ich nun aber nach so einem Rüberfahren außerhalb der JComboBox klicke, schließt sich die JComboBox-Liste und der vorher ausgewählte Name wird angezeigt. Problem: In der JTextArea ist nun aber noch das vorher selektierte als Font aktiv. Ich muss es also iwo schaffen, dass meine Methode
ausgerufen wird. Dachte dabei zuerst daran, dass ich in getListCellRenderComponent() einfach folgenden Code einbaue:
Leider wird das erst aufgerufen, wenn ich zweimal auf außerhalb der JComboBox klicke, das eine Mal schließt das Popup, das zweite mal gibt es einer anderen Komponente den Fokus.
Am idealsten fände ich es aber, wenn, sobald man das JLabel mit dem Fontnamen verlässt, der vorherige Fontname wieder benutzt. Nicht erst, wenn man öfters "um sich geklickt" hat.
Meine Idee war darauf, dass ich einfach mit der Mouse-Methode
das einleiten kann. Hab also jeder ListCellRenderer-Komponente den MouseListener angehängt, der "resetAdopt()" aufruft, aber der wird nie aufgerufen. Iwie verhidnert die JComboBox den Aufruf von Listenern... Weiß jemand dafür eine Lösung?
Habs jetzt mit "mouseExited()" auf die JComboBox selbst versucht, aber da arbeitet die Zeile 37-40 im geposteten Code entgegen. Schließlich bleibt die eine Komponente selektiert, solange das Popup offen ist. Also kann ich das auch nciht so lassen. Perfekt wäre am Ende, nur "mouseEntered()" und "mouseExited()" dafür zu benutzen. Bleibt also nur die Frage, wie schaffe ich es, den MouseListener erfolgreich den Komponenten in der JComboBox zu übergeben?
Gruß, Thomas
ich hab hab grad einen Text-Editor gebastelt. Das heißt, es gibt eine JTextArea mit dem Text, 4 Buttons für Fett, Kursiv, Unter- und Durchgestrichen und zwei JComboBoxen, eine ist Editable und für die Größe des Text verantwortlich, die andere enthält alle verfügbaren Font-Namen. Nun versuche ich mich (zuerst nur an der JComboBox mit den Font-Namen) daran, dass, wenn man die JComboBox anklickt und über die Font-Namen fährt, der Text sich automatisch dementsprechend verändert. Also so eine Art Vorschau.
Hier mal der Code, wie ich die ComboBox initialisiere:
Java:
boxName = new JComboBox();
boxName.setModel(new DefaultComboBoxModel(getAvailableFontNames()));
boxName.setRenderer(new StringRenderer(boxName));
boxName.setPreferredSize(new Dimension(150, 30));
boxName.addActionListener(adopt);
boxName.setSelectedItem("SansSerif");
Und hier der Renderer:
Java:
private class StringRenderer extends JLabel implements ListCellRenderer{
private String oldName;
private StringRenderer(JComboBox target){
super();
setOpaque(true);
setBorder(new LineBorder(Color.white));
}
private void temporaryAdoptToActual(){
Design actual = Saves.properties.process.getActual();
if (actual != null && actual.getMode() == Design.TEXT){
TextDesign td = (TextDesign) actual;
td.setFontName(getText());
}
}
private void resetAdopt(){
Design actual = Saves.properties.process.getActual();
if (actual != null && actual.getMode() == Design.TEXT){
TextDesign td = (TextDesign) actual;
td.setFontName(oldName);
td.setFontName(getText());
}
}
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
String s = (String) value;
setText(s);
if (isSelected){
setBackground(new Color(235, 235, 255));
temporaryAdoptToActual();
}
else
setBackground(new Color(215, 215, 255));
return this;
}
Also das mit dem Rüberfahren geht sogar schon. Er fragt in
Code:
getListCellRendererComponent()
Code:
temporaryAdoptToActual()
Code:
resetAdopt()
Java:
if (!boxName.isPopupVisible()){
resetAdopt();
}
Leider wird das erst aufgerufen, wenn ich zweimal auf außerhalb der JComboBox klicke, das eine Mal schließt das Popup, das zweite mal gibt es einer anderen Komponente den Fokus.
Am idealsten fände ich es aber, wenn, sobald man das JLabel mit dem Fontnamen verlässt, der vorherige Fontname wieder benutzt. Nicht erst, wenn man öfters "um sich geklickt" hat.
Meine Idee war darauf, dass ich einfach mit der Mouse-Methode
Code:
mouseExited(MouseEvent e)
Habs jetzt mit "mouseExited()" auf die JComboBox selbst versucht, aber da arbeitet die Zeile 37-40 im geposteten Code entgegen. Schließlich bleibt die eine Komponente selektiert, solange das Popup offen ist. Also kann ich das auch nciht so lassen. Perfekt wäre am Ende, nur "mouseEntered()" und "mouseExited()" dafür zu benutzen. Bleibt also nur die Frage, wie schaffe ich es, den MouseListener erfolgreich den Komponenten in der JComboBox zu übergeben?
Gruß, Thomas