如何重新排序JLabel的arrayList以在列表顶部显示Label

时间:2015-04-10 06:10:30

标签: java swing arraylist jtextfield

我有一个面板,根据数组项列出一组JLabel。还有JTextFiledJButton作为搜索工具。

因此,我可以设法将输入的文本与JLabel进行比较,并突出显示匹配的JLabel。但我想要做的是将JLabel带到列表的顶部。当搜索字段被清除时,它会回到它的初始位置。

这是我的代码:

public class JavaApplication78 {

    JFrame frame;
    JPanel panel, labelsPanel, searchPanel;
    JLabel label;
    JTextField field;
    JButton button;
    ArrayList<String> names = new ArrayList<String>();
    ArrayList<JLabel> labelsArray = new ArrayList<JLabel>();
    Border paddingBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
    Border border = BorderFactory.createLineBorder(Color.black);
    JScrollPane labelsScroll;

    public JavaApplication78() {
        frame = new JFrame();
        panel = new JPanel(new BorderLayout());
        names.add(".mp3");
        names.add(".html");
        names.add(".jpeg");
        names.add(".mp4");
        names.add(".pdf");

        labelsPanel = new JPanel(new GridBagLayout());
        listLabels();



        searchPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        field = new JTextField(10);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 10;
        searchPanel.add(field, c);

        button = new JButton("Ser");
        c.weightx = 1;
        searchPanel.add(button, c);

        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                String word = getText();
                for(JLabel label : labelsArray){
                    if (label.getText().equals(word)){
                        //labelsArray.add(0, labelsArray.get(i));
                        labelsArray.add(0, label);

                        label.setBackground(Color.red);
                    }
                }
            }
        });
        field.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                field.setText("");
                listLabels();
            }
        });

        panel.add(searchPanel, BorderLayout.NORTH);

        panel.add(labelsScroll, BorderLayout.CENTER);
        frame.add(panel);
        frame.setSize(200, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                new JavaApplication78();
            }
        });
    }
    public String getText(){
        return field.getText();
    }
    public void listLabels(){
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        labelsScroll = new JScrollPane(labelsPanel);
        for (String format : names) {
            label = new JLabel(format);
            //icon
            labelsArray.add(label);
            labelsPanel.add(label, gbc);
            label.setBorder(BorderFactory.createCompoundBorder(border, paddingBorder));
            label.setOpaque(true);
            label.setBackground(Color.white);
        }
    }    
}

是否知道如何将找到的JLabel置于列表顶部并在搜索字段清除后将其放回?

1 个答案:

答案 0 :(得分:1)

大多数布局管理器会根据添加的顺序布局组件,也称为z顺序。

所以你可以使用像...这样的东西。

Order

    field.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //Reset
            for (int order = 0; order < labelsArray.size(); order++) {
                JLabel label = labelsArray.get(order);
                labelsPanel.setComponentZOrder(label, order);
            }

            String text = field.getText();
            for (JLabel label : labelsArray) {
                if (label.getText().equals(text)) {
                    labelsPanel.setComponentZOrder(label, 0);
                    break;
                }
            }

            labelsPanel.revalidate();
            labelsPanel.repaint();
        }
    });

根据输入到字段中的文本重新排序标签。此示例在尝试查找匹配标签之前,根据标签在labelsArray中显示的顺序重置订单