Как я могу разместить компонент в JLayeredPane прямо под существующим компонентом? - PullRequest
4 голосов
/ 19 августа 2011

У меня есть JTextField, и прямо под ним я хочу показать JLabel, помещенный в JLayeredPane (я буду использовать его для автопредставлений позже).

Как я могу разместить мою JLabel в JLayeredPane прямо под JTextField?

Вот код, который у меня есть, и текущий результат, показанный на скриншоте ниже:

public static void main(String[] args) {

    JTextField field = new JTextField();
    JLabel lbl = new JLabel("Hello");
    lbl.setBackground(Color.YELLOW);
    lbl.setOpaque(true);

    JLayeredPane layeredPane = new JLayeredPane();
    layeredPane.setLayout(new GridLayout(0,1));
    layeredPane.add(lbl, (Integer) (JLayeredPane.POPUP_LAYER - 10));
    layeredPane.setPreferredSize(field.getPreferredSize());

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(field, BorderLayout.NORTH);
    panel.add(layeredPane, BorderLayout.SOUTH);

    JFrame frame = new JFrame();
    frame.add(panel);
    frame.setSize(200, 360);
    frame.setVisible(true);
}

enter image description here

Вторая попытка:

public static void main(String[] args) {

    JTextField field = new JTextField();
    JLabel lbl = new JLabel("Hello");
    lbl.setBackground(Color.YELLOW);
    lbl.setOpaque(true);
    lbl.setBounds(field.getBounds().x, field.getBounds().y, 
        field.getBounds().width, field.getBounds().height);

    JPanel popPanel = new JPanel(new BorderLayout());
    popPanel.add(lbl, BorderLayout.NORTH);
    popPanel.setLocation(field.getLocation().x+10, field.getLocation().y+20);
    popPanel.setPreferredSize(field.getPreferredSize());

    JFrame frame = new JFrame();

    JLayeredPane layeredPane = frame.getRootPane().getLayeredPane();
    layeredPane.setLayout(new GridLayout(0,1));
    layeredPane.add(popPanel, (Integer) (JLayeredPane.POPUP_LAYER - 10));

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(field, BorderLayout.NORTH);

    frame.add(panel);
    frame.setSize(200, 360);
    frame.setVisible(true);
}

enter image description here

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Добавьте многослойную панель в «ЦЕНТР», а не на ЮГ.

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

Если вы хотите открыть список предложений, вам просто нужно использовать JPopupMenu и расположить его под текстовым полем. Прочитайте раздел из учебника по Swing на Открытие всплывающих меню .

2 голосов
/ 19 августа 2011

почему бы не использовать автозаполнение ComboBox / JTextField и если вы не хотите отображать JComboBox, тогда есть AutoCompleted JTextField, а для несколько уменьшенных автопредставлений будет лучше поискать недекорированные JDialog/Window с JTable with one TableColum and without TableHeaded в JScrollPane, просто с RowSorter, очень простая работа

2 голосов
/ 19 августа 2011

Прежде всего, я не думаю, что вы должны использовать JLayeredPane для этого, а просто постоянную метку.

Если вы используете многоуровневую панель, вам придется вычислять, где текстовое полезаканчивается (y = field.getY() + field.getHeight()) и установите вашу JPanel в 'panel.setLocation (0, y)' внутри JLayeredPane (при условии, что JLayeredPane имеет ту же начальную позицию, что и базовый JFrame).Вы могли бы эквивалентно расположить JLayeredPane в (0, y) и поместить метку в (0, 0) в пределах этой многоуровневой панели.

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

...