GUI komponensek dinamikus átméretezése

GUI komponensek dinamikus átméretezése
2013-06-14T20:53:29+02:00
2013-06-14T22:18:03+02:00
2022-11-29T05:45:39+01:00
tpeter88
Sziasztok!

A következő problémában szeretném a segítségeteket kérni. Látszólag egyszerű a probléma, de mégis órák óta nem találok rá megoldást. :(
A lényeg, hogy van egy GUI, amin van két darab panel (JScrollPane). Azt szeretném, hogy ezeknek a mérete úgy változzon, ahogy a felhasználó módosítja az ablak méretét. Erre a következő kódot használtam:


frame.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { filePane.setPreferredSize(new Dimension( frame.getContentPane().getWidth(), frame.getContentPane().getHeight() / 2)); dataPane.setPreferredSize(new Dimension( frame.getContentPane().getWidth(), frame.getContentPane().getHeight() / 2)); } });

Ez mindaddig működik is, amíg nem használom a "Teljes méret" opciót. Akkor ugyanis egész egyszerűen szétesik a GUI. Egyelőre annyit tudtam tenni, hogy inaktiváltam ezt a lehetőséget, de ez nyilván nem megoldás. :)
Bízom benne, hogy tudtok segíteni, mert sajnos nem nagyon van ötletem, mi lehet a gond. :(

Köszönöm előre is!
Mutasd a teljes hozzászólást!
BorderLayout helyett a BoxLayout-ot javaslom, amelynél az említett komponensek mérete automatikusan igazodik az ablakméret változásai szerint.

Egy példa az elmondottakra:


import java.awt.Dimension; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class Test extends JFrame { JScrollPane filePane, dataPane; public Test(){ setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); filePane = new JScrollPane(new JTextArea(5,30)); filePane.setPreferredSize(new Dimension(300, 100)); dataPane = new JScrollPane(new JTextArea(5,30)); dataPane.setPreferredSize(new Dimension(300, 100)); add(filePane); add(dataPane); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationByPlatform(true); setSize(600,250); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Test(); } }); } }
Mutasd a teljes hozzászólást!

  • A konténernél milyen elrendezéskezelő (layout manager) van beállítva?
    Mutasd a teljes hozzászólást!
  • BorderLayout-ot használtam hozzá. Itt van a teljes kód, amivel reprodukálni lehet a hibát.

    private static JFrame frame; private static JScrollPane dataPane; private static JScrollPane filePane; public static void main(String[] args) { frame = new JFrame("GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(filePane(), BorderLayout.PAGE_START); frame.add(dataPane(), BorderLayout.PAGE_END); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { filePane.setPreferredSize(new Dimension(frame.getContentPane().getWidth(), frame.getContentPane().getHeight() / 2)); dataPane.setPreferredSize(new Dimension(frame.getContentPane().getWidth(), frame.getContentPane().getHeight() / 2)); } }); } private static JScrollPane filePane() { filePane = new JScrollPane(); filePane.setPreferredSize(new Dimension(300, 100)); return filePane; } private static JScrollPane dataPane() { dataPane = new JScrollPane(); dataPane.setPreferredSize(new Dimension(300, 100)); return dataPane; }
    Mutasd a teljes hozzászólást!
  • BorderLayout helyett a BoxLayout-ot javaslom, amelynél az említett komponensek mérete automatikusan igazodik az ablakméret változásai szerint.

    Egy példa az elmondottakra:


    import java.awt.Dimension; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; public class Test extends JFrame { JScrollPane filePane, dataPane; public Test(){ setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); filePane = new JScrollPane(new JTextArea(5,30)); filePane.setPreferredSize(new Dimension(300, 100)); dataPane = new JScrollPane(new JTextArea(5,30)); dataPane.setPreferredSize(new Dimension(300, 100)); add(filePane); add(dataPane); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationByPlatform(true); setSize(600,250); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Test(); } }); } }
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen, tökéletesen működik!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd