2016-11-10 3 views
0

У меня есть JDialog, в котором у меня есть ряд столбцов, над которыми я хочу центрировать JLabel. Кажется, я ничего не могу найти о том, как это сделать. Я могу центрировать его внутри ячейки, но не внутри расширенного набора столбцов. Метки в этом изображении «Цель» и «Изменение» должны быть центрированы. Time Line SettingsЦентрирование пространственных столбцов с GridBagLayout

Здесь находится SSCCE, который производит этот JDialog.

package stokerMonitor; 

import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.Dialog.ModalityType; 

import javax.swing.JDialog; 
import javax.swing.JLabel; 
import javax.swing.JSeparator; 
import javax.swing.SwingConstants; 


public class test { 

static JDialog timeLineDialog; 
static int row=0; 

public static void main(String[] args) { 
    timeLineDialog = new JDialog(); 
    timeLineDialog.setLayout(new GridBagLayout()); 
    timeLineDialog.setModalityType(ModalityType.MODELESS); 
    timeLineDialog.setTitle("Time Line Settings"); 
    timeLineDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
    JLabel timeLabel = new JLabel("Time"); 
    JLabel actionLabel = new JLabel("Action"); 
    JLabel probeTempLabel=null; 
    JLabel pitTempLabel=null; 
    JLabel targetHeader=new JLabel("Target"); 
    Font boldFont=targetHeader.getFont().deriveFont(Font.BOLD, (float) 14); 
    targetHeader.setFont(boldFont); 
    JLabel changeHeader=new JLabel("Change"); 
    changeHeader.setFont(boldFont); 
    if (Configuration.getInstance().celsius) { 
     probeTempLabel = new JLabel("Temp (\u00B0 C)"); 
     pitTempLabel = new JLabel("Temp (\u00B0 C)"); 
    } 
    else { 
     probeTempLabel = new JLabel("Temp (\u00B0 F)"); 
     pitTempLabel = new JLabel("Temp (\u00B0 F)"); 
    } 
    JLabel meatLabel=new JLabel("Meat"); 
    JLabel cookTimeLabel=new JLabel("Est. Time"); 
    JLabel weightLabel=new JLabel("Weight"); 
    JLabel probeLabel=new JLabel("Probe"); 
    JLabel pitLabel=new JLabel("Pit"); 
    setNewSeparator(1,row); 
    GridBagConstraints gbc=makeGbc(2, row); 
    gbc.gridwidth=7; 
    gbc.fill=GridBagConstraints.HORIZONTAL; 
    gbc.anchor=GridBagConstraints.CENTER; 
    timeLineDialog.add(targetHeader,gbc); 
    setNewSeparator(9,row); 
    timeLineDialog.add(changeHeader,makeGbc(10, row)); 
    setNewSeparator(12,row++); 
    setNewSeparator(1,row); 
    timeLineDialog.add(timeLabel, makeGbc(2, row)); 
    timeLineDialog.add(probeTempLabel,makeGbc(3, row)); 
    timeLineDialog.add(meatLabel,makeGbc(4, row)); 
    timeLineDialog.add(weightLabel,makeGbc(5, row)); 
    timeLineDialog.add(cookTimeLabel,makeGbc(6, row)); 
    timeLineDialog.add(probeLabel,makeGbc(7, row)); 
    timeLineDialog.add(actionLabel, makeGbc(8, row)); 
    setNewSeparator(9,row); 
    timeLineDialog.add(pitLabel,makeGbc(10, row)); 
    timeLineDialog.add(pitTempLabel, makeGbc(11, row++)); 
    setNewSeparator(12,row); 
    timeLineDialog.pack(); 
    timeLineDialog.setLocationRelativeTo(GUI.getInstance().getFrame()); 
    timeLineDialog.setVisible(true); 
} 

static void setNewSeparator(int column_,int row_) { 
    JSeparator sep=new JSeparator(SwingConstants.VERTICAL); 
    sep.setPreferredSize(new Dimension(1,1)); 
    GridBagConstraints gbc=makeGbc(column_, row_); 
    gbc.fill=GridBagConstraints.VERTICAL; 
    gbc.weighty=1.; 
    timeLineDialog.add(sep,gbc); 
} 

static GridBagConstraints makeGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     Insets WEST_INSETS=new Insets(5,0,5,5); 
     Insets EAST_INSETS=new Insets(5,5,5,0); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.gridwidth = 1; 
     gbc.gridheight = 1; 

     gbc.anchor = (x == 0) ? GridBagConstraints.WEST : GridBagConstraints.EAST; 
     gbc.fill = (x == 0) ? GridBagConstraints.BOTH 
      : GridBagConstraints.HORIZONTAL; 

     gbc.insets = (x == 0) ? WEST_INSETS : EAST_INSETS; 
     gbc.weightx = (x == 0) ? 0.1 : 1.0; 
     gbc.weighty = 1.0; 
     return gbc; 
    } 
} 

Может кто-нибудь объяснить, что мне нужно сделать, чтобы сосредоточить эти заголовки? ТИА.

+0

Используйте [gridwidth] (http://docs.oracle.com/javase/8/docs/api/java/awt/GridBagConstraints.html#gridwidth) больше 1, чтобы охватывать несколько столбцов. – VGR

+1

@VGR У него уже есть 'gridwidth = 7', по крайней мере для' targetHeader'. (Я не смотрел на другой) – dsh

ответ

3

Подсказка: при отладке макетов, я считаю полезным для настройки каждого компонента, чтобы иметь различный цвет фона. Затем я вижу область, назначенную/заполненную этим конкретным компонентом. Большинство компонентов по умолчанию имеют прозрачный фон, что означает, что их границы не видны. (например, targetHeader.setOpaque(true); targetHeader.setBackground(Color.RED);)

Ситуация, сложившаяся с вашей компоновкой, заключается в том, что JLabel заполняет указанные вами 7 столбцов. Однако сам ярлык рисует текст, который он содержит в самой левой части пространства, которое он заполняет.

Есть два альтернативных решения:

  1. Сообщить метку, вы хотите, чтобы отцентрировать текст в метке: targetHeader.setHorizontalAlignment(JLabel.CENTER);

  2. В качестве альтернативы, вы можете сказать, макет в не заполните пробел. gbc.fill=GridBagConstraints.NONE;

+0

Спасибо. Я использовал gbc.fill = GridBagConstraints.NONE; и это сделало трюк. Мне нужно перечитать эти значения, поскольку это кажется противоположным тому, что подразумевает название. –

+0

Константы заполнения GBC делают именно то, что они говорят. Установите фон и непрозрачность ярлыка, чтобы увидеть его визуально. Если 'fill = NONE', метка не заполняет ячейки (ячейки). С 'fill = HORIZONTAL', тогда метка заполняет его; ярлык просто рисует текст, начинающийся слева от области, на которой находится метка (если вы не установили собственное горизонтальное выравнивание метки в противном случае). Якорь GBC имеет смысл только тогда, когда компонент не заполняется, поскольку, если компонент заполняет пространство, которое он не имеет, то имеет значение, где начинается компонент. Ключом является взаимодействие между различными свойствами и значениями. – dsh

+0

* «Совет: при отладке макетов, я считаю полезным установить для каждого компонента другой цвет фона». * Я прочитаю остальную часть вашего ответа, но вы получите голос за то, что «научите человека ловить рыбу» «возможность комментариев.Хороший :) Многие проблемы с макетами сводятся к OP, предполагая, что компонент будет растянут до размера, если это не так, или ограничение макета, в результате чего назначаются более или менее столбцы или строки, чем они ожидают. Установка цвета BG следует рассматривать как «кислотное испытание» допусков макета, используемых в коде. –

1

Как сказал VGR в своем комментарии, вы должны установить ширину сетки в своих ограничениях, чтобы облегчить GridBagLayout понимание того, как обрабатывать две верхние метки.

Я бы установил ширину сетки для метки метки для 7 и установил ширину сетки для метки замены на 2. Все метки ниже должны быть установлены в единицу.

Затем, когда вы устанавливаете GridBagConstraints.anchor = GridBagConstants.CENTER ;, он должен выполнять поведение, которое вы ищете.

EDIT: Я сказал Целевая метка 5, но я имел в виду 7.

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