Получение соответствующих размеров компонента Swing

Я пробовал JLayeredPane. Итак, в следующем коде я создал файлы JLayeredPane и JLabel. Я добавил метку в многоуровневую панель, которую я добавил в файл JPanel. Затем эта панель была добавлена ​​в JFrame.

public static void main(String[] args) {
        frame = new JFrame("LayeredPane Example");
        frame.setPreferredSize(new Dimension(500,500));
        layeredPane = new JLayeredPane();
        layeredPane.setPreferredSize(new Dimension(400, 400));
        JLabel label = new JLabel("Label on LayeredPane");
        label.setLocation(200, 200);
        System.out.println("Width " + label.getWidth() );
        label.setBounds(20, 20, 400, 40);
        layeredPane.add(label);
        layeredPane.setLayer(label, 10, 1);
        frame.setLayout(new BorderLayout());        
        JPanel panel = new JPanel();
        panel.add(layeredPane);
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

Теперь проблема в том, что если у меня нет оператора label.setBounds(20, 20, 400, 40);, то метка не появляется на многоуровневой панели. Это вызывает два вопроса:

  1. Почему setBounds так важно?
  2. Вероятно, часть моего ответа на предыдущие вопросы заключалась в том, что метка имела начальную высоту и ширину 0 перед установкой границ, что может быть причиной того, что setBounds важен. В этом случае я хочу знать, как определить соответствующие границы для компонента Swing, когда я добавляю его в файл JLayeredPane. (Если мои границы меньше соответствующего размера компонента, компонент будет скрыт)

Изменить: на первый вопрос был дан более подробный ответ здесь.


person Ankit    schedule 19.06.2012    source источник


Ответы (1)


Касательно:

  1. Почему setBounds так важен: JLayeredPane по сути использует нулевой макет, и всякий раз, когда вы используете нулевые макеты, вы, кодировщик, несете полную ответственность как за размер, так и за положение добавляемых компонентов. Это просто правила этого макета.
  2. Как определить соответствующие границы: одна вещь, которую я сделал, это просто позволить компоненту сказать мне, каков его предпочтительный размер, а затем использовать его для своего размера:

myJLabel.setSize(myJLabel.getPreferredSize());

Еще одна вещь, которую я сделал, - это использовать непрозрачные панели JPanel для каждого слоя моей панели JLayeredPane, придать этим панелям JPanel соответствующие макеты, а затем добавить свои компоненты в панель JPanel соответствующего слоя. Затем я использую прослушиватель, чтобы убедиться, что размер слоя JPanel соответствует размеру его контейнера JLayeredPane.

person Hovercraft Full Of Eels    schedule 19.06.2012