Hallo,
ich baue gerade eine Oberfläche mit einem "scrollable" Desktop und mehreren Fenstern. Diese werden mit Hilfe von dem GridLayout angeordnet. Das funktioniert auch alles sehr gut. Die Fenster werden dank eines CustomDesktopmanager alle gleichzeitig vergrößert usw. Jedoch, wenn ich in ein Fenster klicke und dieses den Fokus bekommt, dann springt es immer nach oben links. Das will ich vermeiden. Im Moment hab ich dies versucht in dem ich beim klick das Layout auf null setzte. Damit verliere ich aber die Möglichkeit zu scrollen.
Hat jemand einen Rat?
Hier ein KSKB:
Danke schonmal!
ich baue gerade eine Oberfläche mit einem "scrollable" Desktop und mehreren Fenstern. Diese werden mit Hilfe von dem GridLayout angeordnet. Das funktioniert auch alles sehr gut. Die Fenster werden dank eines CustomDesktopmanager alle gleichzeitig vergrößert usw. Jedoch, wenn ich in ein Fenster klicke und dieses den Fokus bekommt, dann springt es immer nach oben links. Das will ich vermeiden. Im Moment hab ich dies versucht in dem ich beim klick das Layout auf null setzte. Damit verliere ich aber die Möglichkeit zu scrollen.
Hat jemand einen Rat?
Hier ein KSKB:
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import javax.swing.DefaultDesktopManager;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JScrollPane;
public class GridDesktop {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JFrame frame = new JFrame("");
frame.setSize(new Dimension(800, 600));
BorderLayout bl= new BorderLayout();
JDesktopPane jd= new JDesktopPane();
JScrollPane jsp= new JScrollPane(jd);
CustomDesktopManager cdm = new CustomDesktopManager();
jd.setDesktopManager(cdm);
frame.add(jsp, bl.CENTER);
JInternalFrame jif = null;
for(int i=0; i<20; i++){
jif = new JInternalFrame("jif"+i, true, false, true, true);
jif.setSize(new Dimension(50,30));
jd.add(jif);
jif.show();
}
cdm.setGrid(jif);
frame.setVisible(true);
}
}
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import javax.swing.DefaultDesktopManager;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
public class CustomDesktopManager extends DefaultDesktopManager {
Dimension oldSize, olderSize;
Point oldPoint;
Component help;
Point beforeDrag;
@Override
public void iconifyFrame(JInternalFrame f) {
super.iconifyFrame(f);
f.setVisible(false);
}
@Override
public void deiconifyFrame(JInternalFrame f) {
super.deiconifyFrame(f);
f.setVisible(true);
}
@Override
public void beginResizingFrame(JComponent f, int direction) {
Container parent = f.getParent();
parent.setLayout(null);
oldSize = f.getSize();
olderSize = f.getSize();
}
@Override
public void resizeFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
//super.resizeFrame(f, newX, newY, newWidth, newHeight);
Dimension desktopSize = f.getParent().getSize();
int i = 0;
for (Component c : f.getParent().getComponents()) {
c.setSize(newWidth, newHeight);
Point location = c.getLocation();
// c.setLocation(c.getLocation().x+(newWidth-oldSize.width), c.getLocation().y+(newHeight-oldSize.height));
i++;
//oldSize=c.getSize();
if (c.getLocation().x >= oldSize.width || c.getLocation().y >= oldSize.height /*&& c!=f*/) {
//System.out.println("oldsize "+oldSize+" location "+c.getLocation());
if (c.getLocation().y >= oldSize.height) {
double help_y = c.getY() / oldSize.height;
int faktor_y = (int) Math.ceil(help_y);
System.out.println("faltor y" + faktor_y);
c.setLocation(c.getLocation().x, c.getLocation().y + faktor_y * (c.getHeight() - oldSize.height));
}
if (c.getLocation().x >= oldSize.width) {
double help_x = c.getX() / oldSize.width;
int faktor_x = (int) Math.ceil(help_x);
System.out.println("faltor y" + faktor_x);
c.setLocation(c.getLocation().x + faktor_x * (c.getWidth() - oldSize.width), c.getLocation().y);
}
}
}
oldSize = f.getSize();
}
@Override
public void endResizingFrame(JComponent f) {
setGrid(f);
//f.getParent().setSize(f.getParent().getLayout().minimumLayoutSize(f.getParent()));
}
@Override
public void beginDraggingFrame(JComponent f) {
f.getParent().setLayout(null);
System.out.println("Parent SIze " + f.getParent().getParent().getSize());
f.getParent().setSize(new Dimension(f.getParent().getWidth(), f.getHeight() * 50));
beforeDrag = f.getLocation();
}
@Override
public void endDraggingFrame(JComponent f) {
if (!beforeDrag.equals(f.getLocation(oldPoint))) {
setGrid(f);
}
System.out.println("end dragging");
super.endDraggingFrame(f);
}
@Override
public void maximizeFrame(JInternalFrame f) {
super.maximizeFrame(f);
f.getParent().setLayout(null);
}
public void setGrid(JComponent f) {
Dimension size = f.getParent().getParent().getParent().getParent().getParent().getSize();
int x_count = size.width / f.getWidth();
if (x_count == 0) {
x_count = 1;
}
int y_count = f.getParent().getComponents().length / x_count;
System.out.println("x " + x_count + " y " + y_count + " from parant widht" + size.width + " f widht " + f.getWidth());
f.setPreferredSize(oldSize);
Component[] components = f.getParent().getComponents();
f.getParent().setLayout(new GridLayout(y_count, x_count));
for (Component c : components) {
c.setPreferredSize(new Dimension(50, f.getHeight()));
}
}
}
Danke schonmal!
Zuletzt bearbeitet: