0

それらのリストを表示しJPanelsて再配置する方法はありますか?リストの作成は、を使用して行うことがBoxLayoutできますが、2つを交換するにはどうすればよいですJPanelsか?パネルがインタラクティブであり続けることも重要です。

例を試してみましょう:

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

public class PanelList {

    private static final class Entry extends JPanel {

        public Entry(final int i) {
            super();
            final JButton button = new JButton("Dialog '" + i + "'");
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    JOptionPane.showMessageDialog(Entry.this, "Hello World '"
                            + i + "'");
                }
            });
            this.add(button);
        }
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("PanelList");
                f.setLayout(new GridLayout(1, 2));
                f.add(new BoxLayoutList());
                f.add(new JListList());
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.pack();
                f.setVisible(true);
            }
        });
    }

    private static final class BoxLayoutList extends JPanel {
        private final List<Entry> entries = new ArrayList<>();

        public BoxLayoutList() {
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            int i = 0;
            while (i < 10) {
                final Entry entry = new Entry(i);
                this.add(entry);
                this.entries.add(entry);
                i++;
            }
        }
    }

    private static final class JListList extends JPanel {
        private final DefaultListModel<Entry> entries = new DefaultListModel<>();

        public JListList() {
            final JList<Entry> entryComponent = new JList<>(this.entries);
            this.add(entryComponent);
            entryComponent.setCellRenderer(new ListCellRenderer<Entry>() {
                @Override
                public Component getListCellRendererComponent(
                        JList<? extends Entry> list, Entry value, int index,
                        boolean isSelected, boolean cellHasFocus) {
                    return value;
                }
            });
            int i = 0;
            while (i < 10) {
                final Entry entry = new Entry(i);
                this.entries.addElement(entry);
                i++;
            }
            // Example: Swap entries 4 and 2
            final Entry buffer = this.entries.get(4);
            this.entries.set(4, this.entries.get(2));
            this.entries.set(2, buffer);
        }
    }
}

BoxLayoutはインタラクティブになりましたが、JListの代替のエントリ4と2で行ったように、エントリを交換する方法がわかりません。しかし、コンポーネントを操作することは不可能です。

4

2 に答える 2

4

ドラッグ アンド ドロップ2リオーダーでJList1を使用します。

  1. リストの使い方
  2. ドラッグ アンド ドロップとデータ転送: はじめに
于 2012-10-01T14:51:51.163 に答える
1

あなたのコメントから、私たちは複雑すぎると考えていたようです -プログラムで2人の子供を交換したい場合、必要なのは

container.add(comp, index)

簡単なスニペット (ハードコードされたインデックスを使用した最も粗雑なロジック:)

final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
for (int i = 0; i < 6; i++) {
    panel.add(new JTextField("was at: " + i, 20));
}

Action action = new AbstractAction("exchange") {

    @Override
    public void actionPerformed(ActionEvent e) {
        JTextField one = (JTextField) panel.getComponent(2);
        JTextField second = (JTextField) panel.getComponent(5);
        second.setText(second.getText() + " -> 2");
        one.setText(one.getText() + " -> 5");
        panel.add(second, 2);
        panel.add(one, 5);
        panel.revalidate();
    }

};
frame.add(new JButton(action), BorderLayout.SOUTH);
于 2012-10-02T11:15:24.830 に答える