2011-11-19 24 views
25

Mój kod nie działa:Jak ustawić określony rozmiar okna (ramki) w huśtawce Java?

JFrame frame = new JFrame("mull"); 

mull panel = new mull(); 

// add panel to the center of window 
frame.getContentPane().add("Center", panel); 
frame.setSize(500, 300); // << not working!!! 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.pack(); // give a suitable size to window automatically 
frame.setVisible(true); // make window visible 

Dostaję bardzo małe okno. Jak to naprawić?

+1

* "Jak ustawić określony rozmiar okna (ramki) w java swing?" * Częściej ustawiasz preferowany rozmiar okienka zawartości ramki lub komponentu w okienku zawartości . Założenie, że wie, jak duża jest sama ramka, a od tego, jak układać lub renderować treść, jest pełne kłopotów. –

Odpowiedz

47

Cóż, używasz zarówno frame.setSize(), jak i frame.pack().

Powinieneś użyć jednego z nich na raz.

Za pomocą setSize() możesz podać rozmiar ramki, ale jeśli użyjesz pack(), to automatycznie zmieni rozmiar klatek zgodnie z rozmiarem składników w nim. Nie będzie uwzględniać rozmiaru, o którym wspomniałeś wcześniej.

Spróbuj usunąć frame.pack() z kodu lub wstaw go przed ustawieniem rozmiaru, a następnie uruchom.

+2

Dzięki! Zadziałało! –

+1

Twoje powitanie! :) – gprathour

+4

Przenieś 'pack()' przed 'setSize()', ale ** nie ** usuń! Wywołanie 'pack()' (frames) lub 'validate()' (applet) jest niezbędne do poprawnego układu poza GUI. Albo jeszcze lepiej, dodaj trochę zawartości do ramki, aby zarządzający układem mogli ustalić, jak duży * powinien być * po spakowaniu (i usunąć wszelkie wywołania, aby ustawić rozmiar, preferowany rozmiar, maksymalny lub (możliwie równy) minimalny rozmiar). -1 –

8

Większość menedżerów układu działa najlepiej z preferowaną wielkością komponentu, a większość interfejsów graficznych najlepiej umożliwia komponentom, które zawierają, ustawienie własnych preferowanych rozmiarów na podstawie ich zawartości lub właściwości. Aby korzystać z tych menedżerów układów, aby uzyskać jak największą korzyść, należy wywołać pack() na kontenerach najwyższego poziomu, takich jak JFrames, zanim będą one widoczne, co powie menedżerom, że wykonają swoje czynności - aby rozmieścić ich komponenty.

Często kiedy potrzebuję odgrywać bardziej bezpośrednią rolę w ustawianiu rozmiaru jednego z moich komponentów, nadpisuję getPreferredSize i zwrócę Wymiar większy niż super.preferredSize (lub jeśli nie to zwraca wartość super).

Na przykład, oto mały drag-a-prostokąt app, który stworzyłem dla another question on this site:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MoveRect extends JPanel { 
    private static final int RECT_W = 90; 
    private static final int RECT_H = 70; 
    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 
    private static final Color DRAW_RECT_COLOR = Color.black; 
    private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255); 
    private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H); 
    private boolean dragging = false; 
    private int deltaX = 0; 
    private int deltaY = 0; 

    public MoveRect() { 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (rect != null) { 
     Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR; 
     g.setColor(c); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(rect); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 

     @Override 
     public void mousePressed(MouseEvent e) { 
     Point mousePoint = e.getPoint(); 
     if (rect.contains(mousePoint)) { 
      dragging = true; 
      deltaX = rect.x - mousePoint.x; 
      deltaY = rect.y - mousePoint.y; 
     } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     dragging = false; 
     repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     Point p2 = e.getPoint(); 
     if (dragging) { 
      int x = p2.x + deltaX; 
      int y = p2.y + deltaY; 
      rect = new Rectangle(x, y, RECT_W, RECT_H); 
      MoveRect.this.repaint(); 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Zauważ, że moim głównym klasa jest JPanel, a zastąpić JPanel za getPreferredSize:

public class MoveRect extends JPanel { 
    //.... deleted constants 

    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 

    //.... deleted fields and constants 

    //... deleted methods and constructors 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

Należy również pamiętać, że kiedy wyświetlaj mojego GUI, umieścić go w JFrame, zadzwoń pack(); na JFrame, ustawić jego pozycję, a następnie zadzwonić setVisible(true); na moim JFrame:

private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
Powiązane problemy