2012-03-22 3 views
10

У меня есть панель из JPanel. У меня есть пользовательский элемент управления, полученный от JLabel. Я пытаюсь сосредоточить этот обычай JLabel на моей панели.Центрирование JLabel в JPanel

Единственный способ, которым я знаю, что это будет работать, это использовать пустой макет (setLayout(null)), а затем вычислить пользовательский JLabel setLocation() так, чтобы он находился в нужном месте.

Пользовательский JLabel физически перемещается с одной панели на эту панель в этом приложении, и я считаю, что местоположение, ранее установленное в setLocation, влияет на вещи. Однако, когда я устанавливаю его на (0,0), компонент поднимается в верхний левый угол.

BorderLayout не работает, потому что, когда только 1 компонент предусмотрен и помещен в BorderLayout.CENTER, центральная секция расширяется, чтобы заполнить все пространство.

Пример, который я нарезал и наклеил с другого сайта BoxLayout и component.setAlignmentX(Component.CENTER_ALIGNMENT). Это тоже не сработало.

Еще один ответ, упомянутый выше, на функцию панели getInset() (я думаю, это то, что она называлась), но это оказалось тупиком.

До сих пор я работаю с панелью с макетом GridBagLayout, и я включаю объект GridBagConstraints, когда я ввожу пользовательскую JLabel в свою панель. Однако это неэффективно. Есть ли лучший способ сосредоточить JLabel в моем JPanel?

+8

Рассмотрите вопрос о фактическом вопросе из разглагольствования. –

+0

О, и после использования метода GridBagLayout & GridBagConstraints все выглядит нормально, если я минимизирую и затем восстанавливаю главное окно. – Shackleford

+2

Время написания всего этого разговора было достаточно, чтобы набрать в Google Swing работу с менеджерами макетов, щелкнув первый удар официальных обучающих руководств, посмотрите на визуальный путеводитель, решите, что BoxLayout выглядит многообещающим и видя пример, который делает больше или меньше того, что вы хотите (он содержит два компонента iso один) – Robin

ответ

8

BoxLayout - это путь. Если вы создали X_Axis BoxLayout, попробуйте добавить горизонтальные клеи до и после того, как компоненты:

panel.add(Box.createHorizontalGlue()); 
panel.add(label); 
panel.add(Box.createHorizontalGlue()); 
7

Забудьте все LayoutManagers в стандартной библиотеке Java и использовать MigLayout. По моему опыту гораздо проще работать с обычно делает именно то, что вы ожидаете от этого.

Вот как это сделать после использования MigLayout.

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     // use MigLayout 
     panel.setLayout(new MigLayout()); 

     // add the panel to the frame 
     frame.add(panel); 

     // create the label 
     JLabel label = new JLabel("Text"); 

     // give the label MigLayout constraints 
     panel.add(label, "push, align center"); 

     // show the frame 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

Большая часть всего лишь шаблона. Ключом является ограничение компоновки: "push, align center":

align center сообщает MigLayout о размещении JLabel в центре его ячейки сетки.

push сообщает MigLayout о расширении ячейки сетки, чтобы заполнить доступное пространство.

+0

Существует отличный чит-лист MigLayout, доступный по адресу: http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt

+0

Вы можете скачать последнюю версию MigLayout здесь: http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt

+0

Интересно! Спасибо за подсказку, я буду иметь это в виду на будущее, но на данный момент я надеюсь остаться в библиотеках Java для вещей. Я все еще очень новичок и стараюсь учиться. – Shackleford

23

Набор GridBagLayout для JPanel, положить JLabel без GridBagConstraints к JPanel, JLabel будет центрирован

enter image description here

пример

import java.awt.*; 
import javax.swing.*; 

public class CenteredJLabel { 

    private JFrame frame = new JFrame("Test"); 
    private JPanel panel = new JPanel(); 
    private JLabel label = new JLabel("CenteredJLabel"); 

    public CenteredJLabel() { 
     panel.setLayout(new GridBagLayout()); 
     panel.add(label); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CenteredJLabel centeredJLabel = new CenteredJLabel(); 
      } 
     }); 
    } 
} 
+0

Благодарим вас, mKorbel, за то, что вы не только публикуете полезную информацию, но и делаете это так тщательно. К сожалению, это заставило меня в той же ситуации, когда у меня неожиданное поведение (ничто не появляется в моей панели после размещения моего JLabel). Когда я наполнил ваш пример моим фактическим кодом и использовал манекен JButton, размещение JButton было идеальным. Я даже добавил некоторые настройки к этому JButton, чтобы имитировать мой JLabel, и он все еще работал, но когда я использовал мой JLabel? Вот тогда все не работает. Я не понимаю. Должно быть что-то, что мешает моей JLabel делать то, что делают эти манекены JButtons. – Shackleford

13

Supose ваш JLabel называется label, а затем использовать:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

Это, безусловно, старое сообщение, но при пересмотре Swing для нового проекта это было, безусловно, самым простым и точным ответом. Почему это не означает, что ответ за пределами меня. – Maxs728

+0

Это неправильно. Это влияет на положение содержимого этикетки, а не на позицию метки в контейнере. – Kroky

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