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
Variante 2: innere Klassen
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);
}
}
}