Poniżej wrzuciłem przykładowy fragment kodu, dzięki któremu można zarządzać rozmieszczeniem okna. Albo przynajmniej zrozumieć co trzeba uwzględnić przy centrowaniu.
Kopiuj
abstract class Ramka implements Runnable
{
private boolean zmaksymalizowane = false;
protected JFrame r;
protected Ramka(JFrame r)
{
updateLF(r);
this.r = r;
}
Ramka(JFrame r, boolean zmaksymalizowane)
{
this(r);
this.zmaksymalizowane = zmaksymalizowane;
}
final public static void setSystemLF()
{
try
{
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e){}
}
final public static void updateLF(Component c)
{
Cursor obecny = c.getCursor();
c.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
SwingUtilities.updateComponentTreeUI(c);
c.validate();
c.setCursor(obecny);
}
@Override public void run()
{
r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ustalWymiary();
pozycjonujOkno();
if(zmaksymalizowane)
r.setExtendedState(JFrame.MAXIMIZED_BOTH);
r.setVisible(true);
}
abstract protected void ustalWymiary();
protected void pozycjonujOkno() { centrujOkno(); }
private void centrujOkno() { r.setLocation(punktCentrowania(r)); }
static Point punktCentrowania(Component c)
{
Rectangle ekr = c.getGraphicsConfiguration().getBounds();
Insets mrgekr = Toolkit.getDefaultToolkit().getScreenInsets(
c.getGraphicsConfiguration());
Dimension okno = c.getSize();
return punktCentrowania(ekr, mrgekr, okno);
}
static Point punktCentrowania(final Rectangle ekr,
final Insets mrgekr, Dimension okno)
{
Rectangle ok = new Rectangle(ekr.x, ekr.y, okno.width, okno.height);
dopasujOkno(ok, ekr, mrgekr, true);
return new Point(ok.x, ok.y);
}
static Rectangle dopasujOkno(Rectangle okno, final Rectangle ekr,
final Insets mrgekr, boolean centruj)
{
final boolean w_poziomie = okno.width < ekr.width - (mrgekr.left + mrgekr.right);
final boolean w_pionie = okno.height < ekr.height - (mrgekr.top + mrgekr.bottom);
if(centruj)
centruj(okno, ekr, w_poziomie, w_pionie);
if(okno.x < ekr.x + mrgekr.left)
okno.x += mrgekr.left;
if(okno.y < ekr.y + mrgekr.top)
okno.y += mrgekr.top;
Point koniec_ekranu = new Point(
ekr.x + ekr.width - mrgekr.right,
ekr.y + ekr.height - mrgekr.bottom);
Point koniec_okna = new Point(okno.x + okno.width, okno.y + okno.height);
if(w_poziomie && koniec_ekranu.x < koniec_okna.x)
okno.x -= koniec_okna.x - koniec_ekranu.x;
if(w_pionie && koniec_ekranu.y < koniec_okna.y)
okno.y -= koniec_okna.y - koniec_ekranu.y;
return okno;
}
static void centruj(Rectangle okno, final Rectangle ekr,
boolean w_poziomie, boolean w_pionie)
{
okno.x = ekr.x;
okno.y = ekr.y;
if(w_poziomie)
okno.x += (ekr.width >> 1) - (okno.width >> 1);
if(w_pionie)
okno.y += (ekr.height >> 1) - (okno.height >> 1);
}
}
class RamkaDopasowana extends Ramka
{
RamkaDopasowana(JFrame r, boolean maks) { super(r, maks); }
@Override protected void ustalWymiary() { r.pack(); }
}
class RamkaUstalona extends Ramka
{
RamkaUstalona(JFrame r, int sz, int wy)
{
super(r);
szer = sz;
wys = wy;
}
@Override protected void ustalWymiary() { r.setSize(szer, wys); }
private int szer, wys;
}