2012-10-01 39 views
0

有沒有辦法顯示JPanels列表並重新排列它們?創建一個列表可以通過使用BoxLayout來完成,但是如何交換兩個JPanels呢?面板保持交互性也很重要。組件/ LayoutManager顯示JPanel列表

我會盡力的例子:

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一樣。但是我不可能與組件交互。

回答

1

從您的評論好像我們覺得太複雜了 - 如果你想編程交換兩個孩子,你需要的是

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