2009-10-19 2 views
2

Я пишу простое приложение на Java, которое выполняет некоторые моделирование частиц на кучке овец (не спрашивайте). Для этого я хочу окно с JPanel для графики (которое будет изменяться с помощью простого combobox, содержащего некоторые стандартные разрешения) и некоторые другие элементы, такие как кнопки для запуска и приостановки имитации и т. Д.Неверная упаковка JFrame с использованием JPanel в borderlayout

Мой вопрос: я используя метод JFrame.pack, чтобы собрать все красиво вместе с помощью borderLayout. Но по какой-то причине JPanel упакован неправильно, похоже, что упаковка игнорирует его, поэтому размер окна изменяется, чтобы соответствовать размеру только двух кнопок, которые у меня есть сейчас. Что я делаю не так?

Это код до сих пор (немного новичка, так что никаких комментариев по моей тупости, если нет какой-либо;)):

public class Window { 
public Sheepness sheepness; 

public ButtonPanel buttonPanel; 
public PaintPanel paintPanel; 
public JFrame frame; 

public Window(Sheepness sheepness, int width, int height) { 
    this.sheepness = sheepness; 

    frame = new JFrame("Sheepness simulation"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //frame.setSize(width, height); 

    BorderLayout frameLayout = new BorderLayout(); 
    JPanel background = new JPanel(frameLayout); 
    background.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 

    buttonPanel = new ButtonPanel(this); 
    background.add(BorderLayout.SOUTH, buttonPanel.buttonBox); 

    paintPanel = new PaintPanel(this); 
    paintPanel.setSize(600, 600); 
    background.add(BorderLayout.CENTER, paintPanel); 

    frame.getContentPane().add(background); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setVisible(true); 
} 
} 

public class PaintPanel extends JPanel { 
public Window window; 

public PaintPanel(Window window) { 
    this.window = window; 
} 

@Override 
public void paintComponent(Graphics g) { 
    g.setColor(Color.blue); 
    g.fillRect(0, 0, 300, 200); 
} 
} 

public class ButtonPanel { 
public Window window; 
public Box buttonBox; 

public JButton startButton; 
public JButton resetButton; 

public ButtonPanel(Window window) { 
    this.window = window; 

    buttonBox = new Box(BoxLayout.X_AXIS); 

    startButton = new JButton("Start"); 
    startButton.addActionListener(new startButtonListener()); 
    buttonBox.add(startButton); 

    resetButton = new JButton("Reset"); 
    resetButton.addActionListener(new resetButtonListener()); 
    buttonBox.add(resetButton); 
} 
}
+0

Я прояснил теги на ваш вопрос, надеюсь, вы не против. –

+0

Спасибо, полностью забыл о java и swing тегах. – FinalArt2005

ответ

4

Try:

paintPanel.setPreferredSize(600, 600); 

Как Window.pack() размеры в предпочтительные размеры его подкомпонентов и JPanel получают свой предпочтительный размер от его дочерних компонентов (в вашем случае их нет).

+0

Он работает! Большое спасибо! – FinalArt2005

+0

Тот же код, новая проблема: я получаю некоторую границу справа и внизу окна. Я знаю, что здесь есть еще одна подобная тема, но решение там установило параметр resizable для фрейма в false, хотя это не работает для меня. Вероятно, это связано с методом pack, но почему он добавляет границу? Я просто хочу, чтобы он плотно упаковал все компоненты (с границей 10 пикселей, но это уже сделано с setBorder). Кроме того, между JPanel и кнопками есть большое «пробелы», вызвано ли это одной проблемой и как ее удалить? – FinalArt2005

+0

Извините, но не внизу, только справа, но я думаю, что это внизу и справа от JPanel, так что это также вызывает «пробелы» между JPanel и кнопками. – FinalArt2005

Смежные вопросы