java – 如何将组件放在现有组件正下方的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);
}
第二次尝试:
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);
}
解决方法:
将layeredPane添加到“CENTER”,而不是SOUTH.
但是,您对平铺窗格的理解似乎有点困惑.如果希望多个组件显示在彼此的顶部(堆叠?),则可以使用分层窗格.您仍然在二维中使用分层窗格,这是不必要的.你可以使用一个面板.
如果要弹出建议列表,则应使用JPopupMenu并将其放在文本字段下方.阅读Bringing up Popup Menus上的Swing教程中的部分.
标签:java,swing,jlayeredpane 来源: https://codeday.me/bug/20190610/1209948.html