Det kan du meget besværligt gøre ved at lave en listener der lytter til når framen bliver resizet, men så skal du beregne den nye størrelse af samtlige komponenter, og sætte dem eksplicit med setBounds. Som du selv skriver er det dog bedst at bruge en fornuftig layout manager, da den laver alle disse beregninger selv.
Jeg har nu lavet en metode som beregner den nye heigth og width når man har resized framen. Men hvordan får jeg så placeret min knap på den nye position? Helst på en smart måde, uden brug af private variabler!
Du skal erklære TestKnap som en private variable, ellers kan du ikke få fat i den og sætte dens bounds. Dernæst skal du tilføje følgende kode som det sidste i componentResized. Bemærk at koden ikke tager hensyn til insets, dvs rammernes bredde og højde. For at få en perfekt centrering mht disse skal du også have fat i insets og korrigere. try{ Dimension d = TestKnap.getSize(); int W = d.width; int H = d.height; TestKnap.setBounds(aktuelWidth/2-W/2,aktuelHeigth/2-H/2,W,H); } catch(NullPointerException npe) {}
Jeg synes at der er noget galt med denne linje: TestKnap.setBounds(aktuelWidth/2-W/2,aktuelHeigth/2-H/2,W,H); Første gang man resizer framen, så bliver knappen centreret!! Det er jo ikke meningen. Men efterfølgende når man resizer, så virker det.
Jeg har desuden fået fat i Insets. Men hvordan sætter jeg dem efter resize?
public class TestSwing extends JFrame implements ActionListener, ComponentListener { private JFrame window = new JFrame(); private int aktuelWidth = 0; private int aktuelHeigth = 0; int insetsLeft = 0; int insetsRigth = 0; int insetsTop = 0; int insetsButtom = 0; private JPanel panel = new JPanel(); JButton TestKnap = new JButton("Test");
try { Dimension d = TestKnap.getSize(); int W = d.width; int H = d.height; TestKnap.setBounds(aktuelWidth / 2 - W / 2, aktuelHeigth / 2 - H / 2, W, H);
} catch (NullPointerException npe) { }
}
public void componentMoved(ComponentEvent w) { }
public void componentHidden(ComponentEvent w) { }
public void componentShown(ComponentEvent w) { }
public void actionPerformed(ActionEvent e) { }
public static void main(String[] args) { TestSwing test = new TestSwing();
Så ved jeg ikke hvad du er ude efter. Du vil have at man skal kunne se komponenten når man resizer. Det kan man da den placeres lige i centrum. Hvor vil du ellers have den? Du kan altid sætte setBounds(0,0,w,h) så ses den i øverste venstre hjørne. Hvis du præciserer hvad du ønsker kan det være jeg kan hjælpe, men den er da synlig nu :)
I den try-catch der er kan du så istedet hente bounds fra komponenten og addere dine beregnetW/H til bounds, og kalde setBounds igen: setBounds(oldXBound+beregnetWidth,oldYBound+beregnetHeight,80,20)
Men jeg må nok erkende at det er rimelig besværligt, hvis man har mange komponenter. Så er det nok lettere at kende de forskellige LayoutManager's godt.
Er der nogle standard LayoutManagers man skal bruge, hvis man ønsker at man kan resize sit window, og bagefter stadig kan se alle komponenterne? (så komponenterne bare tilpasser sig i størrelsen.)
(Ligesom IntelliJ editoren el. Eclipse editoren gør).
Ja, du har fuldkommen ret i at man skal kende de medfølgende layout managere. Hvis du bruger et eller andet IDE så pas på med at bruge en af deres managere, det har andre ikke tilrådighed, og din kode kan ikke bruges andre steder. De fleste layout manager vil vise dig alle komponenter med mindre du gør dit vindue meget lille. Selv FlowLayout der er det simpleste vil kunne det. Af de mest brugbare vil jeg nævne BorderLayout hvor du kan bestemme om en komponent skal være i nord,syd,øst,vest eller centrum. Det lyder som om det er meget få men husk at de enkelt komponenter jo typisk vil indeholde andre managere, f.eks. til at samle et antal knapper under eller ved siden af hinanden. Her bruger man ofte et JPanel til at holde disse. En anden meget brugbar komponent i den sammenhæng er Box'e, hvor du kan kalde Box.createVerticalBox og tilsvarende Box.createHorizontalBox. Til dem kan du bare add'e komponenter, og boxene har den egenskab at de sørger for at komponenterne får samme størrelse, f.eks. med en horisontal box får alle komponenter samme højde, og modsat med en vertikal box. Husk at du kun skal proppe de elementer ind der i forvejen har nogenlunde samme størrelse. Så, kort sagt, lær BorderLayuot og Box klassen at kende. Layout er, som du har set, et ret komplekst område hvis man selv vil lave noget. Hvis du laver komplekse layouts med de indbyggede managere skal du være klar over at de fleste swing komponenter har en minimal størrelse, en maksimal størrelse, og en foretrukken størrelse, og hvis du designer komponenter skal du sørge for at dine komponenter også har det. God fornøjelse.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.