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

ここに画像の説明を入力

2 回目の試行:

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 を SOUTH ではなく「CENTER」に追加します。

ただし、レイアウトされたペインの理解は少し混乱しているようです。複数のコンポーネントを互いの上に (積み重ねて) 表示する場合は、レイヤード ペインを使用します。不要な 2 次元でレイヤード ペインを引き続き使用しています。これにはパネルを使用できます。

提案のリストをポップアップ表示する場合は、JPopupMenu を使用してテキスト フィールドの下に配置します。ポップアップ メニューの表示に関する Swing チュートリアルのセクションを読んでください。

于 2011-08-19T14:34:36.027 に答える
2

なぜ AutoComplete ComboBox / JTextFieldを使用しないのですか? を表示したくない場合JComboBoxは、 があり、自動提案を何らかの形で減らすには、プレーンな非常に単純なジョブだけで装飾されていないものをAutoCompleted JTextField探す方がよいでしょうJDialog/WindowJTable with one TableColum and without TableHeadedJScrollPaneRowSorter

于 2011-08-19T14:53:14.573 に答える
2

まず第一に、そのために JLayeredPane を使用するべきではないと思いますが、単なる永続的なラベルです。

レイヤード ペインを使用する場合は、テキスト フィールドの終了位置 ( y = field.getY() + field.getHeight()) を計算し、JPanel を JLayeredPane 内の「panel.setLocation(0, y)」に設定する必要があります (JLayeredPane の開始位置が基礎となる JFrame)。同様に、JLayeredPane を (0, y) に配置し、そのレイヤード ペイン内の (0, 0) にラベルを配置することもできます。

コンポーネントのサイズが変更されるたびに、これが行われていることを確認する必要があります。

于 2011-08-19T14:34:36.283 に答える