2011-11-19 19 views
25

Il mio codice non funziona:Come impostare la dimensione specifica della finestra (frame) in java swing?

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 

io sono sempre molto piccola finestra. Come sistemarlo?

+1

* "Come impostare la dimensione specifica della finestra (frame) in java swing?" * È più comune che si desideri impostare la dimensione preferita del riquadro del contenuto di un frame o forse un componente nel riquadro del contenuto . Presumere di sapere quanto è grande rendere il frame stesso, e da questo come organizzare o rendere il contenuto, è pieno di problemi. –

risposta

47

Bene, si sta utilizzando sia frame.setSize() e frame.pack().

È necessario utilizzare uno di questi in una volta.

Utilizzando setSize() è possibile specificare la dimensione del frame che si desidera ma se si utilizza pack(), verrà automaticamente modificata la dimensione dei frame in base alla dimensione dei componenti in esso. Non prenderà in considerazione le dimensioni che hai menzionato prima.

Provare a rimuovere frame.pack() dal codice o metterlo prima di impostare le dimensioni e quindi eseguirlo.

+2

Grazie! Ha funzionato! –

+1

il benvenuto! :) – gprathour

+4

Sposta 'pack()' prima di 'setSize()' ma ** non ** rimuoverlo! Una chiamata a 'pack()' (frames) o 'validate()' (applet) è necessaria per il corretto layout fuori dalla GUI. O meglio ancora, aggiungi alcuni contenuti alla cornice in modo che i gestori di layout possano capire quanto grande * deve essere * quando è imballato (e rimuovere qualsiasi chiamata per impostare la dimensione, la dimensione preferita, la dimensione massima o (eventualmente anche minima)). -1 –

8

La maggior parte dei gestori di layout funziona meglio con la preferenza di un componente, e la maggior parte delle GUI è meglio consentire ai componenti che contengono di impostare le proprie preferenze in base al loro contenuto o proprietà. Per utilizzare questi gestori di layout a proprio vantaggio, chiamare lo pack() sui contenitori di livello superiore come JFrames prima di renderli visibili, in quanto ciò dirà a questi gestori di eseguire le proprie azioni, di impaginare i componenti.

Spesso, quando ho bisogno di svolgere un ruolo più diretto nell'impostare le dimensioni di uno dei miei componenti, sostituirò getPreferredSize e restituirò una dimensione più grande di super.preferredSize (o, in caso contrario, restituisce il valore del super).

Per esempio, ecco una piccola applicazione drag-a-rettangolo che ho creato per 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(); 
     } 
     }); 
    } 
} 

Si noti che la mia classe principale è un JPanel, e che sovrascrivo getPreferredSize di JPanel:

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); 
    } 

si noti inoltre che quando visualizzo la mia GUI, ho posto in un JFrame, chiamo pack(); sul JFrame, impostare la sua posizione, e quindi chiamare setVisible(true); sul mio 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(); 
     } 
     }); 
    } 
} 
Problemi correlati