2016-06-30 6 views
1

Я создаю макет графического интерфейса для своего приложения, используя сумку сетки, и я пытаюсь создать функцию для компоновки каждого элемента, чтобы мне не пришлось постоянно печатать один и тот же код сетки сумка снова и снова. Я хочу, чтобы переписать этот код:Java-функция для создания панели графического интерфейса

GridBagLayout gridbag = new GridBagLayout(); 
GridBagConstraints bc = new GridBagConstraints(); 
this.setLayout(gridbag); 

bc.fill = GridBagConstraints.HORIZONTAL; 
bc.anchor = GridBagConstraints.WEST; 
bc.insets = new Insets(0, 10, 10, 0); 
bc.gridx = 0; 
bc.gridy = 0; 
bc.gridwidth = 1; 
this.add(programNameLabel, bc); 

так, что его можно записать в вызове функции, как это:

labelPosition(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, programNameLabel); 

Вот функция, которую я написал для выполнения этой задачи.

protected void labelPosition(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, int gridX, int gridY, int gridWidth, JLabel name) 
    { 
     GridBagLayout gridbag = new GridBagLayout(); 
     GridBagConstraints bc = new GridBagConstraints(); 
     this.setLayout(gridbag); 

     bc.fill = axis; 
     bc.anchor = direction; 
     bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour); 
     bc.gridx = gridX; 
     bc.gridy = gridY; 
     bc.gridwidth = gridWidth; 
     this.add(name, bc); 
    } 

Теперь он скомпилируется, но когда я запускаю его, он не работает. Все ярлыки отображаются в одной строке, а не в макете, которую я ищу.

Является ли то, что я пытаюсь сделать просто, возможно, или я что-то пропустил в своем коде? Какие-либо предложения?

ответ

2

Вы создаете новый GridBagLayout() каждый раз, когда вы вызываете свой метод. Вы должны сделать это только один раз, и в вашем методе создайте только GridBagConstraints и добавьте новую метку в свой контейнер (и, кстати, используя более общий тип, например JComponent, вы можете повторно использовать тот же метод даже для других компонентов, чем JLabel):

protected void addComponent(int axis, int direction, int insetOne, int insetTwo, int insetThree, int insetFour, 
          int gridX, int gridY, int gridWidth, JComponent component) { 

    GridBagConstraints bc = new GridBagConstraints(); 

    bc.fill = axis; 
    bc.anchor = direction; 
    bc.insets = new Insets(insetOne, insetTwo, insetThree, insetFour); 
    bc.gridx = gridX; 
    bc.gridy = gridY; 
    bc.gridwidth = gridWidth; 

    this.add(component, bc); 
} 

... 
GridBagLayout gridbag = new GridBagLayout(); 
this.setLayout(gridbag); 

addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 0, 1, new JLabel("Hello")); 
addComponent(GridBagConstraints.HORIZONTAL, GridBagConstraints.WEST, 0, 10, 10, 0, 0, 1, 1, new JButton("World")); 
... 

на стороне записки, если это новый проект, который вы могли бы рассмотреть глядя на JavaFX вместо Swing.

+1

я вижу. Я оставляю вызов GridBagLayout() в функции, где я вызываю функцию labelPosition(), и только переадресую вызов Constraints() к новой функции. Я рад, что это сработало. Это вытолкнуло около 100 строк кода из этого файла и сделало его более читаемым. Спасибо, Андреас. – tworley1977

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