2013-09-25 10 views
0

Я устал, но прежде, чем уйти, просто застрял в почти последних трех строках в фрагменте кода ниже, чтобы сделать кнопку «Обновить» на моей панели tictactoe, надеясь уйти с ней, но ожидая ошибок, поскольку он смешивает менеджеров компоновки в одном контейнере.Смешивание gridlayout и borderlayout

Но это РАБОТАЛО.

ButtonPanel.setLayout(new GridLayout(3, 3));  
guiFrame.add(ButtonPanel); 
for (int i = 0; i < 3; i++) { 
    for (int j = 0; j < 3; j++) { 
    button[i][j] = addButton(ButtonPanel, i, j); 
    } 
} 

JButton refreshbutton = new JButton("Refresh"); 
guiFrame.add(refreshbutton, BorderLayout.SOUTH); // ... border layout worked. Hm. 
refreshbutton.addActionListener(this); 

guiFrame.setVisible(true); } 

Должен ли я быть удивлен? (Имейте в виду, мой newbieness.)

(BOY, я узнал/наткнуться на Buncha материал в письменном виде программы этой глупой игре !!! - например, с помощью setActionCommand для «метки» на каждую кнопку внутри [ в 11,12,13,21, ... 33] поэтому метод ONE actionPerformed мог использовать getActionCommand правильно маркировать [с X или O] кнопка все, что было проталкивается кто Превратим это было.)

+1

Имена переменных не должны начинаться с символа верхнего регистра. 'ButtonPanel' должен быть' buttonPanel'. – camickr

+2

Кроме того, пожалуйста, в дальнейшем обратитесь к разделу «BorderLayout.SOUTH» с 'BorderLayout.PAGE_END', поскольку последний предпочтительнее первого с JDK 1.4 :-) Более подробную информацию можно найти в [BorderLayout Tutorials] (http: // docs. oracle.com/javase/tutorial/uiswing/layout/border.html), чуть ниже кнопки __Launch: -) __ Кроме того, вам не удалось вызвать 'guiFrame.pack()' непосредственно перед тем, как настроить его на видимое и после добавления всех компонентов к нему, что является довольно распространенной ошибкой, которую делают все новички при кодировании в Swing, что во многих случаях приводит к неприятному поведению __ (ТРУДНО СКАЗАТЬ В ЭТОМ МАЛЕНЬКОЙ ПРОСТРАНСТВЕ) __ :-) –

ответ

2

guiFrame. add (refreshbutton, BorderLayout.SOUTH); // ... обработана граница. Гектометр

Только потому, что вы использовали BorderLayout.SOUTH не делает панель BorderLayout. Ваш код работал, потому что диспетчер макета по умолчанию для области содержимого JFrame (JDialog) является BorderLayout. Таким образом, вы просто пользуетесь макетом по умолчанию.

поскольку он смешивает менеджеров компоновки на одном контейнере.

Да, это обычная практика. На самом деле почти невозможно создать достаточно сложный графический интерфейс, если вы не используете разные менеджеры макетов на разных панелях, которые вы добавляете в графический интерфейс.

+0

Пила «pack()» в Netbeans- сгенерированный код; не читал об этом; добавит. – DSlomer64

+0

Я только что добавил pack(), и теперь сетка tictactoe является незначительной, так как я предполагаю, что это делает пакет(). Я предполагаю, что теперь мне нужно возиться с предпочтительным размером и еще что-то, но я просто собираюсь удалить пакет до тех пор, пока что-то лучше не появится либо через чтение, либо во все. Я только что прочитал о setMinimumSize, но я не знаю, что Размер равен ....... – DSlomer64

+0

OK. Добавлено эти две строки: Размер dim = новый Размер (300, 300); guiFrame.setMinimumSize (dim); SO все хорошо. Спасибо за makin 'меня узнать о pack() и Dimension против моей воли! – DSlomer64