JTextArea-Problem in Inneren Klassen und Packages

Status
Nicht offen für weitere Antworten.

andy_y

Mitglied
Hi.

Bin dabei ein kleines Applet zu schreiben, auf dem ich ein bisschen malen und schreiben kann.
Habe bis jetzt eine Klasse, die ich von JApplet abgeleitet habe. In dieser Klasse A erstelle ich eine Instanz der Klasse B, die ich von JPanel abgeleitet hab und importiere diese in der Klasse A. Die Klasse B dient mir als Zeichenfläche. Habe schon einige Beispiele gesehen in denen ein Canvas statt ein JPanel verwendet wird, aber ich möchte vorerst beim JPanel bleiben. In der Klasse B importiere ich die Klasse C, die von JTextArea abgeleitet ist und bilde eine Instanz die ich dem JPanel per Aufruf von add(JTextAreaInstanz) hinzufüge. Die Klasse B selbst wurde per Aufruf von getContentPane().add(JPanelInstanz) der Klasse A hinzugefügt.
Die Klassen B und C befinden sich jeweils in einem eigenen Packet.
Da ich wie gesagt auch zeichne, verwende ich DoubleBuffering, damit mir das bereits gezeichnete nicht verloren geht, wenn das Applet verdeckt wird.

Das Problem:
1. Wenn ich die Klassen B und C als innere Klasse der Klasse A definiere wird das JTextArea (also im Prinzip die Klasse C) ganz normal angezeigt, sobald ich irgendwo auf das JPanel klicke. Das geschieht, in dem ich die Methode newPosition() der Klasse C aufrufe und die Koordinaten des JTextArea übergebe.

Wenn ich aber statt der inneren Klassen die Packages verwende wird das JTextArea nicht mehr normal angezeigt, sondern vielmehr vom JPanel überdeckt. Nur die Stelle, an der der Cursor blinkt, ist zu sehen.
Die Lösung, die ich bis jetzt dafür habe ist, dass ich in der Klasse B (in der ich die Methode zur Positionierung des JTextArea aufrufe), in der update()-Methode die Methode newPosition() nochmal aufrufe. Damit positioniere ich zwar zweimal aber der letzte Schritt ist das Anzeigen des JTextAreas.

Diese Lösung ist aber nicht sehr effektiv und vorallem nicht die beste. Welche Erklärung gibt es für das unterschiedliche Verhalten???

2. Das zweite, was ich nicht verstehe ist, dass, wenn mit den inneren Klassen arbeite das JTextArea ganz normal mit getContentPane().add() dem JPanel hinzugefügt wird. Wenn ich aber mit den Packages arbeite bekomme ich beim compilieren die Meldung: "cannot resolve symbol", symbol: getContentPane().
Wenn ich nur add() zum hinzufügen der Componenten verwende funktionierts.
Warum muss ich die gleich Componente bei Packages mit add() und bei inneren Klassen mit getContentPane().add() hinzufügen???

Variante 1: Packages

Code:
import Test.B.*;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.Color.*;

public class A extends JApplet {
  public B b;
  public void init() {
    getContentPane().setLayout(null);
    b = new B(600,376,new Color(45,100,80));
    getContentPane().add(b);
  }
}

Code:
package Test.B;
import Test.C.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class B extends JPanel implements MouseListener, MouseMotionListener{

  public C c;
  public int X1, Y1, X2, Y2, Xprev, Yprev;
  public Graphics pnlGraphic, offGraphic;
  public String Element = "Free";
  public String Style = "normal";
  public Color Fgcolor;
  public int ArcWidth, ArcHeight;
  Image OSC;
  int widthOfOSC, heightOfOSC;

  public B(int width, int height, Color color) {
    setBounds(0,0,width,height);
    setBackground(new Color(45,100,80));
//    setOpaque(false);
    setLayout(null);
    addMouseListener(this);
    addMouseMotionListener(this);
    c = new C();
    add(c);
  }

  public void mouseEntered(MouseEvent MEvt) {}
  public void mouseExited(MouseEvent MEvt) {}
  public void mouseClicked(MouseEvent MEvt) {}
  public void mouseMoved(MouseEvent MEvt) {}

  public void mousePressed(MouseEvent MEvt) {
    X1 = MEvt.getX();
    Y1 = MEvt.getY();
    X2 = getSize().width;
    Y2 = getSize().height;
    c.newPosition(X1,Y1,X2,Y2);
  }

  public void mouseReleased(MouseEvent MEvt) {}
  public void mouseDragged(MouseEvent MEvt) {}

  private void setupOSC() {
    if(OSC == null || widthOfOSC != getSize().width || heightOfOSC != getSize().height) {
      OSC = null;
      OSC = createImage(getSize().width, getSize().height);
      widthOfOSC = getSize().width;
      heightOfOSC = getSize().height;
      Graphics g = OSC.getGraphics();
      g.setColor(getBackground());
      g.fillRect(0, 0, widthOfOSC, heightOfOSC);
    }
  }

  public void update(Graphics g) {
    paint(g);
  }

  public void paint(Graphics g) {
    setupOSC();
    g.drawImage(OSC, 0, 0, this);
    c.newPosition(X1,Y1,X2,Y2);

  }
}

Code:
package Test.C;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class C extends JTextArea {

  public void newPosition(int x, int y, int w, int h) {
    int h2 = 20;
    if((h-y)<h2) {
      y = h - h2;
    }
    setBounds(x,y,w-x,h2);
//    setBackground(new Color(255,0,0));
    setVisible(true);
    setText("Test . . . .");
    requestFocusInWindow(true);
  }
}

Variante 2: innere Klassen

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.Color.*;

public class A extends JApplet {
  public B b;
  public void init() {
    getContentPane().setLayout(null);
    b = new B(600,376,new Color(45,100,80));
    getContentPane().add(b);
  }

  class B extends JPanel implements MouseListener, MouseMotionListener{

    public C c;
    public int X1, Y1, X2, Y2, Xprev, Yprev;
    public Graphics pnlGraphic, offGraphic;
    public String Element = "Free";
    public String Style = "normal";
    public Color Fgcolor;
    public int ArcWidth, ArcHeight;
    Image OSC;
    int widthOfOSC, heightOfOSC;

    public B(int width, int height, Color color) {
      setBounds(0,0,width,height);
      setBackground(new Color(45,100,80));
//    setOpaque(false);
      setLayout(null);
      addMouseListener(this);
      addMouseMotionListener(this);
      c = new C();
      add(c);
    }

    public void mouseEntered(MouseEvent MEvt) {}
    public void mouseExited(MouseEvent MEvt) {}
    public void mouseClicked(MouseEvent MEvt) {}
    public void mouseMoved(MouseEvent MEvt) {}

    public void mousePressed(MouseEvent MEvt) {
      X1 = MEvt.getX();
      Y1 = MEvt.getY();
      X2 = getSize().width;
      Y2 = getSize().height;
      c.newPosition(X1,Y1,X2,Y2);
    }

    public void mouseReleased(MouseEvent MEvt) {}
    public void mouseDragged(MouseEvent MEvt) {}

    private void setupOSC() {
      if(OSC == null || widthOfOSC != getSize().width || heightOfOSC != getSize().height) {
        OSC = null;
        OSC = createImage(getSize().width, getSize().height);
        widthOfOSC = getSize().width;
        heightOfOSC = getSize().height;
        Graphics g = OSC.getGraphics();
        g.setColor(getBackground());
        g.fillRect(0, 0, widthOfOSC, heightOfOSC);
      }
    }

    public void update(Graphics g) {
      paint(g);
    }

    public void paint(Graphics g) {
      setupOSC();
      g.drawImage(OSC, 0, 0, this);
      c.newPosition(X1,Y1,X2,Y2);
    }
  }
  
  class C extends JTextArea {

    public void newPosition(int x, int y, int w, int h) {
      int h2 = 20;
      if((h-y)<h2) {
        y = h - h2;
      }
      setBounds(x,y,w-x,h2);
//    setBackground(new Color(255,0,0));
      setVisible(true);
      setText("Test . . . .");
      requestFocusInWindow(true);
    }
  }
}
 
B

Beni

Gast
1. Ich habe die beiden Versionen kopiert und ausgeführt: hab überhaupt keinen Unterschied gesehen?

2. "getContentPane" dürfte sich dann auf das Applet beziehen, aber die ContentPane des Applets ist nicht dein Panel. Dein Panel hast du ja ebenfalls der ContentPane hinzugefügt. (Das ContentPane ist zwischen deinem Panel, und dem Applet).
 

André Uhres

Top Contributor
Wenn man packages benutzt, dann macht man auch alles in packages, also auch die Klasse A.
Die package-Namen werden kleingeschrieben.
Benutz lieber paintComponent statt paint, und ruf super.paintComponent(g) als Erstes auf.
Die Klassenattribute sollten alle private sein.
Code:
package test.a;
/*
 * A.java
 */
import test.b.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.Color.*;
public class A extends JApplet {
    private B b;
    public void init() {
        getContentPane().setLayout(null);
        b = new B(600,376,new Color(45,100,80));
        getContentPane().add(b);
    }
}
Code:
package test.b;
/*
 * B.java
 */
import test.c.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class B extends JPanel implements MouseListener, MouseMotionListener{
    private C c;
    private int X1, Y1, X2, Y2, Xprev, Yprev;
    private Graphics pnlGraphic, offGraphic;
    private String Element = "Free";
    private String Style = "normal";
    private Color Fgcolor;
    private int ArcWidth, ArcHeight;
    private Image OSC;
    private int widthOfOSC, heightOfOSC;
    public B(int width, int height, Color color) {
        setBounds(0,0,width,height);
        setBackground(new Color(45,100,80));
//    setOpaque(false);
        setLayout(null);
        addMouseListener(this);
        addMouseMotionListener(this);
        c = new C();
        add(c);
    }
    public void mouseEntered(MouseEvent MEvt) {}
    public void mouseExited(MouseEvent MEvt) {}
    public void mouseClicked(MouseEvent MEvt) {}
    public void mouseMoved(MouseEvent MEvt) {}
    public void mousePressed(MouseEvent MEvt) {
        X1 = MEvt.getX();
        Y1 = MEvt.getY();
        X2 = getSize().width;
        Y2 = getSize().height;
        c.newPosition(X1,Y1,X2,Y2);
    }
    public void mouseReleased(MouseEvent MEvt) {}
    public void mouseDragged(MouseEvent MEvt) {}
    private void setupOSC() {
        if(OSC == null || widthOfOSC != getSize().width || heightOfOSC != getSize().height) {
            OSC = null;
            OSC = createImage(getSize().width, getSize().height);
            widthOfOSC = getSize().width;
            heightOfOSC = getSize().height;
            Graphics g = OSC.getGraphics();
            g.setColor(getBackground());
            g.fillRect(0, 0, widthOfOSC, heightOfOSC);
        }
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setupOSC();
        g.drawImage(OSC, 0, 0, this);
    }
}
Code:
package test.c;
/*
 * C.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class C extends JTextArea {
    public void newPosition(int x, int y, int w, int h) {
        int h2 = 20;
        if((h-y)<h2) {
            y = h - h2;
        }
        setBounds(x,y,w-x,h2);
//    setBackground(new Color(255,0,0));
        setVisible(true);
        setText("Test . . . .");
        requestFocusInWindow(true);
    }
}
 

andy_y

Mitglied
@Beni: Ich hatte vergessen in der Klasse B die Zeile 68 zu entfernen. Ohne die ist der beschriebene "Fehler" zu sehn.

Danke für eure Hilfe, jetzt klappts.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
S Problem mit JButton und JTextArea AWT, Swing, JavaFX & SWT 2
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
J Beliebtes Problem: Scrollbar in JTextArea AWT, Swing, JavaFX & SWT 4
A Problem mit JTextArea AWT, Swing, JavaFX & SWT 13
S Seltsames Problem - manchmal enthaelt die ActionMap eine JTextArea keine Actions. AWT, Swing, JavaFX & SWT 4
M jTextArea append Problem AWT, Swing, JavaFX & SWT 8
G JTextArea & JTextField Selection Problem (ersetzen) AWT, Swing, JavaFX & SWT 2
L Problem bei der Ausgabe JTextArea AWT, Swing, JavaFX & SWT 3
D Problem mit JScrollBar, AutoScroll und JTextArea AWT, Swing, JavaFX & SWT 2
C Jtextarea scroll problem AWT, Swing, JavaFX & SWT 3
M JTextArea in JScrollPane, Problem mit Thread.sleep() AWT, Swing, JavaFX & SWT 5
C Problem bei JTextArea AWT, Swing, JavaFX & SWT 8
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
B Problem mit der Kombination von JScrollBar und JTextArea AWT, Swing, JavaFX & SWT 2
L JTextArea Scrollbar-Problem! AWT, Swing, JavaFX & SWT 2
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
P JTextarea (in JScrollPane) zeigt nur die beiden letzten Einträge an? AWT, Swing, JavaFX & SWT 0
RedEagle Swing JTextArea ist leer AWT, Swing, JavaFX & SWT 13
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
E wie in JScrollPane auf JTextArea zugreifen AWT, Swing, JavaFX & SWT 12
K Swing 2 JTextArea parrallel scrollable AWT, Swing, JavaFX & SWT 16
Hatsi09 JTextArea Inhalt verlinken AWT, Swing, JavaFX & SWT 4
ralfb1105 jTextArea Scrollbar hinzufügen - mit Jigloo erstellt AWT, Swing, JavaFX & SWT 7
S Ausgabe in JTextArea AWT, Swing, JavaFX & SWT 13
H JTextArea - farbige Zeilen .. bitte um Vorschläge zur Implementierung AWT, Swing, JavaFX & SWT 1
F 2D-Grafik JTextArea drucken bringt mieses Ergebnis AWT, Swing, JavaFX & SWT 2
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
Bluedaishi JtextArea AWT, Swing, JavaFX & SWT 6
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
G JTextArea mit JScrollPane wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
Bluedaishi JDialog modal und JTextArea AWT, Swing, JavaFX & SWT 4
F JTextarea Steuern ~ consolenanbindung AWT, Swing, JavaFX & SWT 5
F Event Handling JTextArea auf bestimmte Eingabe reagieren (Return-Taste) AWT, Swing, JavaFX & SWT 2
F JTextArea hat keinen Rahmen AWT, Swing, JavaFX & SWT 10
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
R JTextArea mit verschiedenen Textfarben AWT, Swing, JavaFX & SWT 6
HoloYoitsu jTextArea.setCaretPosition(); What am I doing wrong? AWT, Swing, JavaFX & SWT 0
S Zeilenumbruch jTextArea mit toString AWT, Swing, JavaFX & SWT 2
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
M JTextArea - Leertaste "sperren" AWT, Swing, JavaFX & SWT 1
S Inhalt der Java-Konsole in die JTextArea AWT, Swing, JavaFX & SWT 3
M Swing JTextArea mit ScrollBar AWT, Swing, JavaFX & SWT 9
S Swing Zahl der Zeilenumbrüche in einer JTextArea bestimmen AWT, Swing, JavaFX & SWT 1
F Swing Caret in JTextArea vergrößern AWT, Swing, JavaFX & SWT 2
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
N JFrame änliches wie JTextArea? AWT, Swing, JavaFX & SWT 2
A Swing JTextArea - Multi-Line-Editing AWT, Swing, JavaFX & SWT 2
A Swing JTextArea aus anderer Klasse in realtime aktualisieren AWT, Swing, JavaFX & SWT 3
O JTextArea befüllen AWT, Swing, JavaFX & SWT 2
G JTextArea on the fly aus anderem Programm befüllen AWT, Swing, JavaFX & SWT 4
A Swing Einrücken mehrerer Zeilen per Tab in einem JTextPane/JTextArea AWT, Swing, JavaFX & SWT 3
T Swing Ausgabe aus ArrayList in Klasse1 in jTextArea in Klasse2 AWT, Swing, JavaFX & SWT 2
B JTextArea Größe an Container anpassen AWT, Swing, JavaFX & SWT 2
B Drucken der JTextArea AWT, Swing, JavaFX & SWT 4
M JTextArea Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
P JPanel- Listener durch JTextArea aktivieren AWT, Swing, JavaFX & SWT 8
A JTextArea - Zeichenbegrenzung nach .txt Datei import AWT, Swing, JavaFX & SWT 6
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
Hoppelmann Swing Tasten in JTextArea blockieren AWT, Swing, JavaFX & SWT 2
S JTextArea Tastaturanschläge AWT, Swing, JavaFX & SWT 2
E Swing JTextArea in JFrame, wie nun WindowFocusListener implementieren? AWT, Swing, JavaFX & SWT 2
J Swing Mitwachsende JTextArea+ JPanel AWT, Swing, JavaFX & SWT 4
P Swing JtextArea füllen mit setText AWT, Swing, JavaFX & SWT 7
M Probleme mit der Selektion einer JTextArea AWT, Swing, JavaFX & SWT 3
T Die Größe einer JTextArea an Ihren Parent JPanel anpassen. AWT, Swing, JavaFX & SWT 5
hdi Swing ListCellRenderer + JTextArea + LineWrap AWT, Swing, JavaFX & SWT 6
T ComponentOrientation in JTextArea AWT, Swing, JavaFX & SWT 3
H Hintergrundbild in jTextArea AWT, Swing, JavaFX & SWT 4
G Swing JTextArea mit fester Anzahl Spalten! AWT, Swing, JavaFX & SWT 10
G ein JTextArea in zwei JPanels AWT, Swing, JavaFX & SWT 2
L JTextArea mit JScrollPane AWT, Swing, JavaFX & SWT 7
padde479 Swing replace JTextArea funktioniert nicht AWT, Swing, JavaFX & SWT 2
L Zeilenumbrüche aus JTextArea MIT in Textdatei schreiben AWT, Swing, JavaFX & SWT 4
_dp jTextArea/jTextPanel Auto Höhe AWT, Swing, JavaFX & SWT 5
Ollek JTextArea - Feste Zeilenanzahl(8 Zeilen) AWT, Swing, JavaFX & SWT 3
S Swing JTextArea während der Laufzeit füllen AWT, Swing, JavaFX & SWT 5
Ollek Text in JTextField und JTextArea zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
P Datenelement anderer Klasse in JTextArea ausgeben AWT, Swing, JavaFX & SWT 4
P Scrollbar JTextArea AWT, Swing, JavaFX & SWT 23
M Swing Ausgabe in JTextArea verzögern AWT, Swing, JavaFX & SWT 7
T Swing jTextArea soll sich der Fenstergröße anpassen beim ziehen?? AWT, Swing, JavaFX & SWT 2
S System.out in JTextArea AWT, Swing, JavaFX & SWT 4
S Swing JTextArea - Bild auf/ab Tasten implementieren AWT, Swing, JavaFX & SWT 4
J JTextArea verschwindet bei resize vom JFrame AWT, Swing, JavaFX & SWT 2
VfL_Freak "setAccelerator/KeyStroke" bei JTextArea ? AWT, Swing, JavaFX & SWT 6
P Swing JTextArea - beim neuzeichnen bleibt manchmal weißer Kasten AWT, Swing, JavaFX & SWT 10
Dit_ JTextArea zu Zeile X scrollen AWT, Swing, JavaFX & SWT 4
H variable Höhe einer JTextArea (als Renderer/Editor) als Zelle einer JTable AWT, Swing, JavaFX & SWT 9
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
G Swing JTable und JTextArea synchronisieren AWT, Swing, JavaFX & SWT 2
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
M JTextArea AWT, Swing, JavaFX & SWT 2
E Swing JTextArea Alternative? AWT, Swing, JavaFX & SWT 5
A Swing JTextArea über Frame hinaus anzeigen? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben