2010-06-14 5 views
4

Я создаю версию монополии Java в свое свободное время, и у меня есть проблемы с пониманием макетов и т. Д. Для Swing.Создание монопольного совета с GridBagLayout

Каждое из моих мест на доске - это, по сути, обычай JButton, и я пытаюсь уложить их по краю рамки (как на самой монопольной доске). Кажется, я не могу найти полезное объяснение того, как работает система макета, и поэтому у меня проблемы с этим.

Может кто-нибудь, пожалуйста, приведу пример того, как они будут класть кнопки по краю рамки? Должен ли я использовать другой макет?

+0

Спасибо за голосование и принять. Надеюсь, я помог. – jjnguy

ответ

3

Это похоже на то, чтобы лучше работать с BorderLayout. Я бы рекомендовал создать 4 JPanel s, который будет содержать все JButton s.

Затем добавьте JPanels к BorderLayout.North, South, East и West.

Мне кажется, что это самый простой способ компоновки кнопок.

Here - отличное место, чтобы начать использовать BorderLayout.

Я просто бросил код, который может помочь вам приступить к этому. Он не был скомпилирован.

int boardWidth; 
int boardHeight; 
int boardSquareHeight; 
int boardSqusreWidth; 
JPanel north = new JPanel(); 
JPanel south = new JPanel(); 
Dimension northSouthD = new Dimension(boardWidth, boardSquareHeight); 
north.setPreferedSize(northSouthD); 
south.setPreferedSize(northSouthD); 
JPanel east = new JPanel(); 
JPanel west = new JPanel(); 
Dimension eastWestD = new Dimension(boardSquareHeight, boardHeight - 2 * boardSquaareWidth); 
east.setPreferedSize(easWestD); 
west.setPreferedSize(easWestD); 
// add all of the buttons to the appropriate JPanel 
parentPanel.setLayoutManager(new BorderLayout()); 
parentPanel.add(north, BorderLayour.NORTH); 
... 
+0

Большое спасибо.Это объясняет, как эти вещи работают очень хорошо. – seadowg

+0

@Oetzi Добро пожаловать. – jjnguy

0

Стандарт GridLayout может сделать трюк, если вы оставите «внутренние» ячейки пустыми.

+0

Я не знал, что это возможно ... Как вы оставляете клетки пустыми? – seadowg

+0

вы просто добавляете пустые контейнеры, например 'new JPanel()' или 'new JLabel()' – Jack

+0

Пустой? Не на моем Монопольном совете. Бесплатная парковка, общественный сундук и другие карточки - для меня это посередине. – duffymo

0

Вы, вероятно, можете разработать макет в нечто вроде NetBeans, а затем использовать автоматический сгенерированный код (он генерирует расстояния от конструкции вы строите) выложить свой собственный совет, просто скопировать автогенерируемый код и заменяя ваши пользовательские кнопки, а не любой элемент, который вы использовали в качестве заполнителя.

Это позволит вам размещать вещи именно там, где вы хотите их, на основе относительного расстояния, а не пытаться дать понять, качели.

1

Я знаю, что это уже ответили, но я чувствовал, что вы заслуживаете взгляда на то, как работает GridLayout. Прежде всего http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html и http://www.cs.ubc.ca/local/computing/software/jdk-1.5.0/docs/api/java/awt/GridBagConstraints.html помогут расшифровать длинные и загадочные поисковые сигнатуры методов.

Существует три основных части этого примера монополии. Существует настройка макета, добавление Большой средней части в виде JPanels и добавление внешних квадратов в виде JPanels.

public class GridBagLayoutExample extends JFrame { 

public static void main(String[] args) { 
    new GridBagLayoutExample().setVisible(true); 
} 

public GridBagLayoutExample() { 

    try { 
     //Setup the Layout 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     GridBagLayout thisLayout = new GridBagLayout(); 
     thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1, 
       0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 }; 
     thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1, 
       0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 }; 
     getContentPane().setLayout(thisLayout); 

     //Default Grid values 
     int gridX = 0; 
     int gridY = 0; 
     //Add Panels for Each of the four sides 
     for (int j = 0; j < 4; j++) { 
      for (int i = 0; i < 13; i++) { 
       JPanel tempPanel = new JPanel(); 
       switch(j) 
       { 
       case 0://Top Spaces 
        gridX = i; 
        gridY = 0; 
        break; 
       case 1://Left Spaces 
        gridX = 0; 
        gridY = i; 
        break; 
       case 2://Right Spaces 
        gridX = 12; 
        gridY = i; 
        break; 
       case 3://Bottom Spaces 
        gridX = i; 
        gridY = 12; 
        break; 
       } 
       getContentPane().add(tempPanel, 
         new GridBagConstraints(gridX,// XGridSpot 
           gridY,// YGridSpot 
           1,// XGridSpaces 
           1,// YGridSpaces 
           0.0, 0.0, GridBagConstraints.CENTER, 
           GridBagConstraints.BOTH,//Fill 
           new Insets(0, 0, 0, 0), 0, 0)); 
       tempPanel.setBorder(BorderFactory 
         .createLineBorder(Color.BLACK)); 

      } 
     } 

     {// Main Inner Area Notice Starts at (1,1) and takes up 11x11 
      JPanel innerPanel = new JPanel(); 
      getContentPane().add(
        innerPanel, 
        new GridBagConstraints(1, 
          1, 
          11, 
          11, 
          0.0, 0.0, 
          GridBagConstraints.CENTER, 
          GridBagConstraints.BOTH, 
          new Insets(0, 0, 0, 0), 0, 0)); 
     } 
     pack(); 
     setSize(260, 260); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 

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

+0

Хороший пример. Вы задержались слишком поздно. ': (' – jjnguy

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