我有一个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);
}
答案 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
,非常简单的工作