2011-11-19 71 views
25

Mã của tôi không hoạt động:Làm thế nào để đặt kích thước cửa sổ (khung) cụ thể trong 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 

Tôi nhận được một cửa sổ rất nhỏ. Làm thế nào để sửa chữa nó?

+1

* "Cách đặt kích thước cửa sổ (khung) cụ thể trong xoay java?" * Thông thường bạn muốn đặt kích thước ưa thích của ngăn nội dung của khung hoặc có thể là thành phần trong ngăn nội dung . Để đoán xem làm thế nào lớn để làm cho khung chính nó là, và từ đó làm thế nào để sắp xếp hoặc làm cho nội dung, là đầy khó khăn. –

Trả lời

47

Vâng, bạn đang sử dụng cả hai frame.setSize()frame.pack().

Bạn nên sử dụng một trong số chúng cùng một lúc.

Sử dụng setSize() bạn có thể cho kích thước khung bạn muốn nhưng nếu bạn sử dụng pack(), nó sẽ tự động thay đổi kích thước của khung theo kích thước của các thành phần trong đó. Nó sẽ không xem xét kích thước bạn đã đề cập trước đó.

Thử xóa frame.pack() khỏi mã của bạn hoặc đặt mã trước khi đặt kích thước và sau đó chạy.

+2

Cảm ơn! Nó đã làm việc! –

+1

chào mừng bạn! :) – gprathour

+4

Di chuyển 'pack()' trước 'setSize()' nhưng ** không ** xóa nó! Một cuộc gọi đến 'gói()' (khung) hoặc 'validate()' (applet) là cần thiết để bố trí chính xác trong GUI. Hoặc tốt hơn, thêm một số nội dung vào khung để người quản lý bố cục có thể làm việc lớn như thế nào * khi được đóng gói (và loại bỏ bất kỳ cuộc gọi nào để đặt kích thước, kích thước ưa thích, tối đa hoặc (thậm chí có thể) kích thước tối thiểu). -1 –

8

Hầu hết các trình quản lý bố cục hoạt động tốt nhất với tùy chọn ưu tiên của thành phần và hầu hết các GUI đều cho phép các thành phần có chứa tùy chọn của riêng chúngSize dựa trên nội dung hoặc thuộc tính của chúng. Để sử dụng các trình quản lý bố cục này để có lợi thế tốt nhất, hãy gọi pack() trên các vùng chứa cấp cao nhất như JFrames của bạn trước khi hiển thị chúng vì điều này sẽ cho những người quản lý này thực hiện hành động của họ - để bố cục các thành phần của họ.

Thông thường khi tôi cần đóng vai trò trực tiếp hơn trong việc thiết lập kích thước của một trong các thành phần của tôi, tôi sẽ ghi đè getPreferredSize và đặt nó trở lại Thứ nguyên lớn hơn super.preferredSize (hoặc nếu không thì nó trả về giá trị của siêu).

Ví dụ, đây là một ứng dụng kéo một hình chữ nhật nhỏ mà tôi đã tạo cho 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(); 
     } 
     }); 
    } 
} 

Lưu ý rằng lớp học chính của tôi là một JPanel, và rằng tôi ghi đè lên JPanel của 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); 
    } 

Cũng lưu ý rằng khi tôi hiển thị GUI, tôi đặt nó vào JFrame, gọi pack(); trên JFrame, đặt vị trí của nó và sau đó gọi setVisible(true); trên JFrame của tôi:

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(); 
     } 
     }); 
    } 
} 
Các vấn đề liên quan