Swing JTextpane aktuallisiert nicht den setText?

JonasDev

Mitglied
Hey Leute,
ich struggle schon seit Wochen an dieses Problem mein JTextPane wird nicht aktuallisiert und ich denke es liegt an der Struktur der Anwendung, also ich mein die Polyphormie. Mein Prof meinte ich sollte Document verwenden und ich sollte es auch verwenden um den String an gewissen stellen zu stylen. Jedoch ist dies nicht so wichtig, mir geht es in erster Linie um die Aktuallisierung des JTextPane. Ihr seit jetzt meine letzte Hoffnung sonst sind 6 Punkte verstrichen 🙁 .

In dieser Klasse erstelle ich das JFrame und hier fängt auch das Programm an durch den Aufruf des Konstruktors.
Java:
private Ausgabe ausgabe;
private KalenderFrameSplit content = new KalenderFrameSplit();

public KalenderFrame() throws HeadlessException {
    erzeugeFrame();
}

public void erzeugeFrame() {
    setJMenuBar(KalenderMenuBar.getInstance().erstelleMenu(this));
    setTitle("Kalender");
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(1000, 500));

    JSplitPane splitPane = content.bestimmeJSplitpane();
    add(splitPane);

    pack();
    setLocationRelativeTo(null);
    validate();
    setVisible(true);
}

Hier wird das JFrame aufgeteilt in bestimmten bereichen. Ich denke hier liegt das problem weil es einmal eingelesen wird. Ich hab schon ausprobiert die bestimmeJSplitpane() nochmal aufzurufen wenn das RadioButton angeklickt ist damit es wieder aktuallisiert wird aber leider hat es nicht funktioniert.
Java:
private KalenderFrameLinks links = new KalenderFrameLinks();
private KalenderFrameMitte mitte = new KalenderFrameMitte();
private KalenderFrameRechts rechts = new KalenderFrameRechts();

public JSplitPane bestimmeJSplitpane() {

    JPanel leftPanel = this.links.linkerBereich();
    JScrollPane centerPanel = this.mitte.mittlererBereich();
    JPanel rightPanel = this.rechts.rechterBerech();

    JSplitPane splitPane1 = new JSplitPane();
    JSplitPane splitPane2 = new JSplitPane();
    splitPane1.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
    splitPane1.setRightComponent(splitPane2);
    splitPane1.setLeftComponent(leftPanel);
    splitPane1.setEnabled(true);
    splitPane1.setDividerSize(3);

    splitPane2.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
    splitPane2.setRightComponent(rightPanel);
    splitPane2.setLeftComponent(centerPanel);
    splitPane2.setDividerLocation(-2000);
    splitPane2.setEnabled(true);
    splitPane2.setMinimumSize(new Dimension(4000, 0));
    splitPane2.setDividerSize(3);

    return splitPane1;
}

Hier sollte der TextPane aktuallisiert werden. Der String wert der zurückgegeben wird ist Korrekt und er wird auch erstellt wenn das Signal vom RadioButton kommt jedoch aktuallisiert sich das TextPane nicht. Mein Professor sagte ich sollte Document verwenden und ich muss auch Document verwenden um Style hinzuzufügen. Er meinte das ich durch Document mein TextPane aktualisieren kann jedoch hat mir java doc und stackoverflow nicht weiter geholfen.
Java:
private String monatsblattBauplan;

JTextPane textPane = new JTextPane();
public JScrollPane mittlererBereich() {
        JPanel panel = new JPanel(new BorderLayout());

        JTextPane textPane = new JTextPane();
        textPane.setText( "" );
        StyledDocument doc = textPane.getStyledDocument();

//  Define a keyword attribute

        SimpleAttributeSet keyWord = new SimpleAttributeSet();
        StyleConstants.setForeground(keyWord, Color.RED);
        StyleConstants.setBackground(keyWord, Color.YELLOW);
        StyleConstants.setBold(keyWord, true);

//  Add some text

        try
        {
            doc.insertString(0, monatsblattBauplan , null );

            doc.insertString(doc.getLength(), "", keyWord );
        }
        catch(Exception e) { System.out.println(e); }

        this.textPane.setLayout(new BorderLayout(200, 200));
        this.textPane.setEditable(false);
        panel.add(textPane);
        panel.setBackground(Color.white);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(panel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        return scrollPane;
    }

Das ist der RadioButton der das Signal gibt den TextPane zu aktuallisieren durch die Methode baueMonatblattZusammen(jahr).
Java:
private KalenderFrameMitte mitteBereich = new KalenderFrameMitte();
private KalenderFrameLinks linkerBereich = new KalenderFrameLinks();
public JPanel rechterBerech() {
    JPanel panel = new JPanel();
    panel.setLayout(new GridBagLayout());

    JLabel aktionLabel = new JLabel("Aktion waehlen:");

    JRadioButton kalenderblatt = new JRadioButton(this.ausgabe.radioButtonMenue(1), false);
    kalenderblatt.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {

                int jahr = Kalender.getInstance().getJahr();
                Kalender.getInstance().setModus(-1);

                System.out.println("Kalenblatt Radiobutton clicked: jahr = "+jahr );

                mitteBereich.baueMonatblattZusammen(jahr);
            } else {

            }
        }
    });
}
 
Harry,
Sorry hab ganze vergessen diese Methode anzugeben. Also diese Methode funktioniert in der Konsole gibt es was aus aber als JTextpane wird es halt nicht gespeichert.
Java:
public String baueMonatblattZusammen(int jahr) {
    StringBuilder stringBuilder = new StringBuilder();
    for (int monat = 1; monat <= 12; monat++) {
        baueMonatblattZusammen(monat,jahr);
        stringBuilder.append(Kalender.getInstance().getMonatsblatt(jahr, monat));
        stringBuilder.append(String.format("%n"));
    }


    this.monatsblattBauplan = stringBuilder.toString();
    return stringBuilder.toString();
}
 
Naja in der Methode mitteBereich ist ja set Text und ich hab dass davor mit einer zuweisung von baueMonatsblatt zusammen probiert und es hat nicht geklappt. Ich kann das ja ändern aber es bleibt der Fakt das sich diese Methode nicht aktuallisiert.
 
Java:
private String monatsblattBauplan;
 public JScrollPane mittlererBereich() {
        JPanel panel = new JPanel(new BorderLayout());

        JTextPane textPane = new JTextPane();
        textPane.setText(monatsblattBauplan);
        StyledDocument doc = textPane.getStyledDocument();

//  Define a keyword attribute

        SimpleAttributeSet keyWord = new SimpleAttributeSet();
        StyleConstants.setForeground(keyWord, Color.RED);
        StyleConstants.setBackground(keyWord, Color.YELLOW);
        StyleConstants.setBold(keyWord, true);

//  Add some text

        try
        {
            doc.insertString(0, monatsblattBauplan , null );

            doc.insertString(doc.getLength(), "", keyWord );
        }
        catch(Exception e) { System.out.println(e); }



        this.textPane.setLayout(new BorderLayout(200, 200));
        this.textPane.setEditable(false);
        panel.add(textPane);
        panel.setBackground(Color.white);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(panel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        return scrollPane;
    }
 
Naja in der Methode mitteBereich ist ja set Text und ich hab dass davor mit einer zuweisung von baueMonatsblatt zusammen probiert und es hat nicht geklappt.
"Klappt nicht" ist keine Fehlberbeschreibung. Das einzige setText() was ich in deinem Code erkenne, bekommt als Parameter monatsblattBauplan, was in deinem Code nicht initialisiert wird.
Du hast zwar in viertem Codeblock aus deinem ersten Post den Aufruf mitteBereich.baueMonatblattZusammen(jahr) drin, machst mit dem Rückgabewert aber nichts.
Da ausserdem alle deine Codeblöcke aus dem KLassenkontext gerissen sind, kann man nur raten, welcher Block zu welcher Klasse gehört, und welche Klassen man wie miteinander verknoten müsste, damit das ganze Konstrukt überhaupt irgendwie funktioniert.
es bleibt der Fakt das sich diese Methode nicht aktuallisiert
Variablennamen können auf ein neues Objekt zeigen, veränderbare Objekte wie Arrays oder Collections können geändert werden, und Gui-Komponenten können meinetwegen "aktualisiert" werden. Methoden aktualisieren sich nicht. Sie werden aufgerufen oder eben nicht.
Lies das mal durch: https://www.java-forum.org/thema/wie-man-fragen-richtig-stellt.7407/
 
Naja egal versteh nicht genau was du von mir willst dann lass ich das. Also das 2. Versteh ich aber das 1. nicht . Ich rufe die Rechte klass auf und dieser enthält radiobuttons. Diese Radiobuttons enthalten aus dem linkenbereich die informationen des monats und jahr. Wenn ein Radiobutton selected ist dann soll der monatsblatt was in baueMonatsblatt gebaut wurde zurückgegeben werden und global initialisiert. Jetzt frag ich mich halt wie ich es anstellen kann das der textpane die Änderung erfährt und im mittleren Bereich es aktualisiert.
 

Zurück
Oben