4

我有一个 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);
}

在此处输入图像描述

第二次尝试:

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);
}

在此处输入图像描述

4

3 回答 3

4

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

但是,您对分层窗格的理解似乎有些混乱。当您希望多个组件显示在彼此的顶部(堆叠?)时,您可以使用分层窗格。您仍在使用 2 维中的分层窗格,这是不必要的。您可以为此使用面板。

如果您想弹出一个建议列表,那么您应该只使用 JPopupMenu 并将其放置在文本字段下方。阅读 Swing 教程中关于弹出弹出菜单的部分。

于 2011-08-19T14:34:36.027 回答
2

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

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

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

于 2011-08-19T14:34:36.283 回答
2

为什么不使用 AutoComplete ComboBox / JTextField如果你不想显示JComboBox,那么有AutoCompleted JTextField,并且为了以某种方式减少自动建议,最好在中寻找未装饰的JDialog/Window,只是简单,非常简单的工作JTable with one TableColum and without TableHeadedJScrollPaneRowSorter

于 2011-08-19T14:53:14.573 回答