如何将组件放在现有组件正下方的JLayeredPane中?

时间:2011-08-19 13:42:13

标签: java swing jlayeredpane

我有一个JTextField,就在它下面我想要显示一个放在JLayeredPane中的JLabel(稍后我会将其用于自动建议)。

如何将JLabel放在JTextField正下方的JLayeredPane中?

以下是我的一些代码,以及截图中显示的当前结果:

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 个答案:

答案 0 :(得分:4)

将layeredPane添加到“CENTER”,而不是SOUTH。

但是,您对平铺窗格的理解似乎有点困惑。如果希望多个组件显示在彼此的顶部(堆叠?),则可以使用分层窗格。您仍然在二维中使用分层窗格,这是不必要的。你可以使用一个面板。

如果要弹出建议列表,则应使用JPopupMenu并将其放在文本字段下方。阅读Bringing up Popup Menus上的Swing教程中的部分。

答案 1 :(得分:2)

首先,我认为您不应该使用JLayeredPane,而只是永久标签。

如果您确实使用了分层窗格,则必须计算文本字段结束的位置(y = field.getY() + field.getHeight())并将JaayeredPane中的JPanel设置为'panel.setLocation(0,y)'(提供JLayeredPane与底层JFrame具有相同的起始位置。您可以等效地将JLayeredPane定位在(0,y)并将标签放在(0,0)该分层窗格中。

每次调整组件大小时都必须确保完成此操作。

答案 2 :(得分:2)

为什么不使用自动完成ComboBox / JTextField,如果您不想显示JComboBox,那么就会有AutoCompleted JTextField,并且为了某种方式减少自动建议,最好是寻找未修饰的{{} 1}} JDialog/Window中的JTable with one TableColum and without TableHeaded,只有普通的JScrollPane,非常简单的工作