Listener als separate Klasse realisieren ?

Status
Nicht offen für weitere Antworten.

FOXFOX

Mitglied
Hallo zusammen,

im folgenden habe ich eine kleine Anwendung für ne Textausrichtung. Dabei besteht keine Trennung zwischen GUI-Code und Anwendungslogik; da das bei großen Programmen wie einem Texteditor unübersichtlich machen könnte, wollte ich die Listener Klassen in einer separaten Klasse realisieren. Irgendwie habe ich das net hingekriegt, wenn ihr mir da weiterhelfen oder es anhand folgendem beispiel zeigen könntet, wäre ich sehr dankbar.



Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class Textausrichtung extends JFrame {
    private JTextPane textpane;
    private JToolBar toolbar;
    private JButton left, center, right;
    public Textausrichtung() {
    	
        super("Text Align Demo");
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        textpane = new JTextPane();
        toolbar = new JToolBar();
        
        getContentPane().add(new JScrollPane(textpane), BorderLayout.CENTER);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        
        left = new JButton(new StyledEditorKit.AlignmentAction("Left",StyleConstants.ALIGN_LEFT));
        left.setBackground(Color.white);
        left.setToolTipText("linksbündig");
        
        center= new JButton(new StyledEditorKit.AlignmentAction("Center",StyleConstants.ALIGN_CENTER));
        center.setBackground(Color.white);
        center.setToolTipText("zentriert");
        
        right= new JButton(new StyledEditorKit.AlignmentAction("Right",StyleConstants.ALIGN_RIGHT));
        right.setBackground(Color.white);
        right.setToolTipText("rechtsbündig");
        
        toolbar.add(left);
        toolbar.add(center);
        toolbar.add(right);
    }
    
    public static void main(String[] args) {
    	Textausrichtung t= new Textausrichtung();
    	t.setVisible(true);
    }
}
 
du hast ja gar nirgends nen listener :-/

also entweder kannst du das ganze als private klasse realisieren (was ich persönlich präferiere):
Code:
public class Textausrichtung extends JFrame {
   // dein code
   // z.b. btnButtonEins.addActionListener(new ActionListenerNummerEins());
   
   // ActionListener ---------------------------------------------------
   private class ActionListenerNummerEins implements ActionListener {
    // Listener Code
   }

   private class ActionListenerNummerZwei implements ActionListener {
    // Listener Code
   }
}


oder du machst halt eben wirklich ein neues java file für jeden listener... aber wie man ne klasse/neues file macht, weisst du ja schätze ich jetzt mal :bae: ... 🙂
 
so, ich habe mal versucht es so zu implementieren, wie es mir geraten wurde.
das funktioniert auch soweit, nur mit einem haken. wenn ich auf die align-buttons klicke formatiert alle zeilen, wobei ich es möchte, dass er nur die aktuelle zeile formatiert. wie könnte ich das anstellen.
danke im voraus.


Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class Textausrichtung extends JFrame{

	private JTextPane textPane;
    private JToolBar toolbar;
    private JButton left, center, right;
    private Container c;
    
	private StyleContext sc;
	private StyledDocument doc;
	private Style style;
    
    public Textausrichtung(){
        super("Text Align Demo");
        
        c= getContentPane();

        sc= new StyleContext();
        doc= new DefaultStyledDocument(sc);
        style= sc.getStyle(StyleContext.DEFAULT_STYLE);
        
        //Buttons
        left= new JButton("Links");
        center= new JButton("Zentriert");
        right= new JButton("Rechts");
        
        textPane = new JTextPane(doc);
        toolbar = new JToolBar();
        
        left.addActionListener(new EventHandlerTextAlign() );
        center.addActionListener(new EventHandlerTextAlign() );
        right.addActionListener(new EventHandlerTextAlign() );
        
        toolbar.add(left);
        toolbar.add(center);
        toolbar.add(right);
        
        //ToolTip
        setToolTip();
       
        c.add(new JScrollPane(textPane), BorderLayout.CENTER);
        c.add(toolbar, BorderLayout.NORTH);
        
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    
    public void setToolTip(){
        left.setToolTipText("Text linksbündig ausrichten");
        center.setToolTipText("Text zentriert ausrichten");
        right.setToolTipText("Text rechtsbündig ausrichten");
    }
    
    //ActionListener als innere Klasse
    private class EventHandlerTextAlign 
    	implements ActionListener{
    	
    	public void actionPerformed(ActionEvent e){
    		if(e.getSource() == left){
    			StyleConstants.setAlignment(style,StyleConstants.ALIGN_LEFT);
    		}else if(e.getSource() == center){
    			StyleConstants.setAlignment(style,StyleConstants.ALIGN_CENTER);
    		}else if(e.getSource() == right){
    			StyleConstants.setAlignment(style,StyleConstants.ALIGN_RIGHT);
    		}
    		
    	}
    }
    
    public static void main(String[] args){
    	Textausrichtung t= new Textausrichtung();
    	t.setVisible(true);
    }
}
 
google hat auf die schnelle das hier gefunden...
:arrow: http://ostermiller.org/syntax/editor.html

evtl. hilft dir das weiter. hab mich bis jetzt noch nie wirklich mit der TextPane auseinandergesetzt (evtl. musst du auf die EditorPane umsteigen)

tipp noch: du musst nicht für jeden button einen neuen actionlistener instanzieren...
Code:
ActionListener listener = new EventHandlerTextAlign();
left.addActionListener(listener);
center.addActionListener(listener);
right.addActionListener(listener);

<edit>
auf der seite oben meinte ich vorallem dieses snippet:
Code:
document.setCharacterAttributes(
    t.getCharBegin(),
    t.getCharEnd()-t.getCharBegin(),
    /* style */),
    true
);
</edit>
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben