Hi,
ich brauche in einem Fenster eine eigene Titelleiste. Dazu habe ich mir eine eigene Klasse geschrieben die ein JFrame verwendet (sie erbt nicht davon, da ich keine Lust habe alle Methoden zu überschreiben. Stattdessen implementiere ich nur die, die ich wirklich benötige).
Um meine eigene Titelleiste implementieren zu können muss ich das JFrame ja undecorated true setzen. Das hat zur Folge, dass ich es nicht mehr verschieben und vergrößern/verkleinern kann. Diese Funktionen habe ich händisch programmiert, aber jetzt muss ich leider feststellen, dass das resizen sehr hässlich ist. Und zwar hab ich folgende Möglichkeiten:
1. Beim Resizen keine bestimmten Parameter setzen => die GUI flackert und die Componenten werden erst später an die richtige Position gesetzt
2. Zusätzlich nach jedem mouseDragged(MouseEvent evt) Aufruf validate ausführen => GUI flackert immernoch, aber die Componenten werden sofort angepasst
3. Das JFrame vor dem Resizen anweisen, dass es repaint ignorieren soll und anschließend wieder erlauben => GUI flackert nicht, aber alle Componenten werden während des Resize-Vorgangs ausgeblendet. Man sieht lediglich die Hintergrundfarbe des JFrames.
Der dazugehörige MouseListener:
und hier der MouseListener:
Es soll aufjedenfall der Container "titlePane", welchen ich "frame" als BorderLayout.NORTH geadded habe beim Resizen mitaktualisiert werden (größe). Dafür nehme ich ein flackern dieses Containers in Kauf. Außerdem soll noch der Container contentPane seinen Inhalt behalten und nicht flackern. Eine sofortige Anpassung an die neue Größe ist nicht erforderlich.
Ich hoffe es ist soweit alles klar was ich möchte. Danke!
ich brauche in einem Fenster eine eigene Titelleiste. Dazu habe ich mir eine eigene Klasse geschrieben die ein JFrame verwendet (sie erbt nicht davon, da ich keine Lust habe alle Methoden zu überschreiben. Stattdessen implementiere ich nur die, die ich wirklich benötige).
Um meine eigene Titelleiste implementieren zu können muss ich das JFrame ja undecorated true setzen. Das hat zur Folge, dass ich es nicht mehr verschieben und vergrößern/verkleinern kann. Diese Funktionen habe ich händisch programmiert, aber jetzt muss ich leider feststellen, dass das resizen sehr hässlich ist. Und zwar hab ich folgende Möglichkeiten:
1. Beim Resizen keine bestimmten Parameter setzen => die GUI flackert und die Componenten werden erst später an die richtige Position gesetzt
2. Zusätzlich nach jedem mouseDragged(MouseEvent evt) Aufruf validate ausführen => GUI flackert immernoch, aber die Componenten werden sofort angepasst
3. Das JFrame vor dem Resizen anweisen, dass es repaint ignorieren soll und anschließend wieder erlauben => GUI flackert nicht, aber alle Componenten werden während des Resize-Vorgangs ausgeblendet. Man sieht lediglich die Hintergrundfarbe des JFrames.
Der dazugehörige MouseListener:
Code:
private MouseAdapter click = new MouseAdapter() {
public void mousePressed(MouseEvent mou) {
startX = mou.getX();
startY = mou.getY();
startX2 = (int)MouseInfo.getPointerInfo().getLocation().getX();
startY2 = (int)MouseInfo.getPointerInfo().getLocation().getY();
if (rand != NONE) {
frame.setIgnoreRepaint(true);
}
}
public void mouseReleased(MouseEvent mou) {
frame.setIgnoreRepaint(false);
frame.validate();
initial();
}
};
und hier der MouseListener:
Code:
private MouseMotionAdapter drag = new MouseMotionAdapter() {
public void mouseDragged(MouseEvent mou) {
if (mou.getSource() == contentPane && dragContent == false) {
return;
}
int x = (int)MouseInfo.getPointerInfo().getLocation().getX();
int y = (int)MouseInfo.getPointerInfo().getLocation().getY();
int width = frame.getWidth() - (x - startX2);
int height = frame.getHeight() - (y - startY2);
if (rand == NONE) {
frame.setLocation(x - startX,
y - startY);
}
else {
if (rand == EAST) {
setSize(frame.getWidth() + (x - startX2),
frame.getHeight());
}
else if (rand == WEST) {
setBounds(xPos + (x2Pos - xPos) - width,
yPos,
width,
frame.getHeight());
}
else if (rand == SOUTH) {
setSize(frame.getWidth(),
frame.getHeight() + (y - startY2));
}
else if (rand == NORTH) {
setBounds(xPos,
yPos + (y2Pos - yPos) - height,
frame.getWidth(),
height);
}
else if (rand == SOUTH_EAST) {
setSize(frame.getWidth() + (x - startX2),
frame.getHeight() + (y - startY2));
}
else if (rand == SOUTH_WEST) {
setBounds(xPos + (x2Pos - xPos) - width,
yPos,
width,
frame.getHeight() + (y - startY2));
}
else if (rand == NORTH_WEST) {
setBounds(xPos + (x2Pos - xPos) - width,
yPos + (y2Pos - yPos) - height,
width,
height);
}
else if (rand == NORTH_EAST) {
setBounds(xPos,
yPos + (y2Pos - yPos) - height,
frame.getWidth() + (x - startX2),
height);
}
// frame.invalidate();
startX2 = x;
startY2 = y;
}
}
public void mouseMoved(MouseEvent mou) {
Point p = MouseInfo.getPointerInfo().getLocation();
int x = (int)p.getX();
int y = (int)p.getY();
if (xPos - 5 < x && xPos + 5 > x) {
if (yPos - 5 < y && yPos + 5 > y) {
setRand(NORTH_WEST);
}
else if (y2Pos - 5 < y && y2Pos + 5 > y) {
setRand(SOUTH_WEST);
}
else {
setRand(WEST);
}
}
else if (x2Pos - 5 < x && x2Pos + 5 > x) {
if (yPos - 5 < y && yPos + 5 > y) {
setRand(NORTH_EAST);
}
else if (y2Pos - 5 < y && y2Pos + 5 > y) {
setRand(SOUTH_EAST);
}
else {
setRand(EAST);
}
}
else if (yPos - 5 < y && yPos + 5 > y) {
setRand(NORTH);
}
else if (y2Pos - 5 < y && y2Pos + 5 > y) {
setRand(SOUTH);
}
else {
setRand(NONE);
}
}
};
Es soll aufjedenfall der Container "titlePane", welchen ich "frame" als BorderLayout.NORTH geadded habe beim Resizen mitaktualisiert werden (größe). Dafür nehme ich ein flackern dieses Containers in Kauf. Außerdem soll noch der Container contentPane seinen Inhalt behalten und nicht flackern. Eine sofortige Anpassung an die neue Größe ist nicht erforderlich.
Ich hoffe es ist soweit alles klar was ich möchte. Danke!