【问题标题】:How can I place a component in a JLayeredPane right below an existing component?如何将组件放置在现有组件正下方的 JLayeredPane 中?
【发布时间】:2011-10-30 15:34:42
【问题描述】:

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

【问题讨论】:

标签: java swing jlayeredpane


【解决方案1】:

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

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

如果您想弹出一个建议列表,那么您应该只使用一个 JPopupMenu 并将其放在文本字段下方。阅读 Bringing up Popup Menus 上的 Swing 教程部分。

【讨论】:

  • 我确实希望分层内容显示在其他内容之上,我不想在二维中使用它。弹出菜单可能是一个解决方案,但我想在弹出菜单上使用自定义内容,例如多行文本。
  • @Jonas,您可以将任何组件添加到 JPopupMenu。
  • @camickr 据我所知,没有/没有 JComboBox,这个错误仍然存​​在 stackoverflow.com/questions/6559275/jcombobox-on-a-jpopupmenu
  • @mKorbel,感谢您提供的信息。我想你不能同时拥有两个弹出窗口是有道理的,除非你当然以弹出菜单管理子弹出窗口的方式管理弹出窗口。
  • manage the popup the way the popup menu manage child popups 是的,顺便说一句,回到你的帖子,好主意,最复杂,也许可以节省很多无用的编码来为其他 JComponent(s) 构建一些模型,因为这个原因是 up -投票
【解决方案2】:

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

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

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

【讨论】:

  • 一个永久的JLabel不能显示在其他组件上方,所以我认为JLayeredPane更好。在我的新示例中,我尝试在面板上使用setLocation(),但无法正常工作。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2018-01-24
    • 2023-01-13
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多