0

コンポーネントの位置を明示的に (id.x および id.y 制約を使用して) 設定し、コンポーネントが追加されるコンテナーのサイズを変更するときに、MigLayout に問題があります。SSCCE は次のとおりです。

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import net.miginfocom.swing.*;

public class MigClass extends JFrame {

    MigClass(String title) {
        super(title);
        MigLayout layout = new MigLayout();
        setLayout(layout);
        final JPanel content = new JPanel(new MigLayout()); 

        final JLabel l1 = new JLabel("A label");
        content.add(l1, "push, center, top, id l1");
        l1.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                final JTextField editor = new JTextField(5);
                content.add(editor, "pos l1.x l1.y");
                editor.setVisible(true);
                l1.setVisible(false);
                editor.addKeyListener(new KeyListener() {
                    @Override
                    public void keyTyped(KeyEvent e) {
                    }

                    @Override
                    public void keyPressed(KeyEvent e) {
                        if(e.getKeyCode() == (KeyEvent.VK_ENTER)) {
                            l1.setText(editor.getText());
                            editor.setVisible(false);
                            l1.setVisible(true);
                        }
                    }

                    @Override
                    public void keyReleased(KeyEvent e) {
                    }                   
                });
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }

        });
        add(content, "grow, push, span");
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        MigClass gui = new MigClass(null);
    }
}

制約がラベルに追加されている場合 (これは、フレームが拡大されている場合にのみ発生します)、エディターのJTextField位置が正しくありません (l1 の位置と重なる必要があります)。"push"どうすればこの問題を解決できますか?

4

1 に答える 1

0

ドキュメントには明確に記載されていませんが、相対的な配置とグリッド構造を混在させることはできません。相対配置または通常のグリッド構造を使用してください。

2 つのMigLayoutマネージャを設定する必要はありません。パネルは、 の中央領域に簡単に追加できます BorderLayout

hidemode制約を利用した解決策を思いつきました。

package com.zetcode;

import java.awt.EventQueue;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;


public class MigLayoutReplaceEx extends JFrame {

    public MigLayoutReplaceEx() {

        initUI();

        setSize(300, 250);
        setTitle("Replace component");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout());

        JLabel lbl = new JLabel("A label");
        pnl.add(lbl, "cell 0 0, hidemode 3");        

        JTextField field = new JTextField(10);
        pnl.add(field, "cell 0 0, hidemode 3");
        field.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == (KeyEvent.VK_ENTER)) {

                    lbl.setText(field.getText());
                    field.setVisible(false);
                    lbl.setVisible(true);
                }
            }
        });

        field.setVisible(false);

        lbl.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                lbl.setVisible(false);
                field.setVisible(true);
            }
        });

        add(pnl);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigLayoutReplaceEx ex = new MigLayoutReplaceEx();
                ex.setVisible(true);
            }
        });
    }
}

この例は、ウィンドウ上のラベルを示しています。ラベルをクリックすると、ラベルが非表示になり、テキスト フィールドが表示されます。フィールドで Enter キーを押すと、テキスト フィールドが非表示になり、ラベルが表示され、テキスト フィールドから新しいテキストがコピーされます。

非表示のコンポーネントではhidemode 3、レイアウトに参加しません。したがって、他のコンポーネントが常に非表示になっている同じセルにコンポーネントを動的に表示できます。

于 2014-07-15T21:03:15.470 に答える