简体   繁体   English

JList Swing向列表项添加描述

[英]JList Swing adding description to List Item

I am trying to create a JList with a small arrow next to it. 我试图创建一个JList,旁边有一个小箭头。 When clicked, I want some content associated with the list item shown in the same List/Panel. 当我单击时,我希望与列表项相关联的某些内容显示在同一列表/面板中。 The picture, I hope, gives a clear idea of what I am trying to achieve. 我希望这张图片能清楚地说明我要实现的目标。

在此处输入图片说明

How do I do this ? 我该怎么做呢 ? Also, what is the small triangle feature to the left known as (for future search tags) ? 另外,左侧的小三角形特征是什么(对于将来的搜索标签而言)?

I hope this is what you meant. 我希望就是你的意思。 The arrowButton is a JToggleButton which, when activated, displays a JWindow containing information about the selected value of the JList . arrowButton是一个JToggleButton ,当激活该arrowButton时,将显示一个JWindow其中包含有关JList的选定值的信息。 This JWindow will remain visible until the JToggleButton s state is set back to unselected again. JWindow将保持可见,直到JToggleButton的状态再次设置回未选中。 The ListPanel class should be reusable in your code. ListPanel类应可在您的代码中重用。


Code: 码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Example {

    public Example() {

        JFrame frame = new JFrame();

        ArrayList<Object> elements = new ArrayList<Object>();
        ArrayList<String> texts = new ArrayList<String>();
        ListPanel listPanel = new ListPanel(elements, texts);

        JButton addButton = new JButton("Add");
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                JTextField elementField = new JTextField(5);
                JTextArea textArea = new JTextArea(5, 10);

                JPanel panel = new JPanel();
                panel.add(new JLabel("Element:"));
                panel.add(elementField);
                panel.add(Box.createHorizontalStrut(15));
                panel.add(new JLabel("Text:"));
                panel.add(new JScrollPane(textArea));

                int result = JOptionPane.showConfirmDialog(frame, panel, "Element & Text",
                        JOptionPane.OK_CANCEL_OPTION);
                if (result == JOptionPane.OK_OPTION) {
                    listPanel.addElementToList(elementField.getText(), textArea.getText());
                }
            }
        });

        JButton deleteButton = new JButton("Remove");
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (listPanel.getList().getSelectedValue() != null) {
                    listPanel.removeElementFromList(listPanel.getList().getSelectedValue());
                }
            }
        });

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addButton);
        buttonPanel.add(deleteButton);

        frame.add(listPanel);
        frame.add(buttonPanel, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }

}

class ListPanel extends JPanel {
    private JList<Object> list;
    private JToggleButton arrowButton;
    private ArrayList<String> texts;
    private JWindow popup;

    public ListPanel(ArrayList<Object> elements, ArrayList<String> texts) {

        this.texts = texts;

        popup = new JWindow();

        arrowButton = new JToggleButton("\u25B6");
        arrowButton.setMargin(new Insets(0, 0, 0, 0));
        arrowButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (arrowButton.isSelected()) {
                    Object value = list.getSelectedValue();
                    if (value != null) {
                        JLabel titleLabel = new JLabel(value.toString());
                        titleLabel.setBackground(Color.WHITE);
                        titleLabel.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 14));
                        titleLabel.setHorizontalAlignment(JLabel.LEFT);

                        JPanel titlePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                        titlePanel.setBackground(Color.WHITE);
                        titlePanel.add(titleLabel);

                        JTextPane textPane = new JTextPane();
                        textPane.setEditable(false);
                        textPane.setText(texts.get(list.getSelectedIndex()));

                        JPanel contentPanel = new JPanel(new BorderLayout());
                        contentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                        contentPanel.add(titlePanel, BorderLayout.NORTH);
                        contentPanel.add(textPane);

                        popup.setLocation(arrowButton.getLocationOnScreen().x + arrowButton.getWidth(),
                                arrowButton.getLocationOnScreen().y);
                        popup.setContentPane(contentPanel);
                        popup.revalidate();
                        popup.pack();
                        popup.setVisible(true);
                    }
                } else {
                    if (popup.isVisible()) {
                        popup.setVisible(false);
                    }
                }

            }
        });

        Timer timer = new Timer(100, null);
        timer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (((JFrame) SwingUtilities.getWindowAncestor(ListPanel.this)) != null) {
                    activateComponentListener();
                    timer.stop();
                }
            }
        });
        timer.start();

        list = new JList<Object>(new DefaultListModel<Object>());
        for (Object element : elements) {
            ((DefaultListModel<Object>) list.getModel()).addElement(element);
        }

        JPanel buttonPanel = new JPanel(new BorderLayout());
        buttonPanel.setBackground(Color.WHITE);
        buttonPanel.add(arrowButton, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setBorder(null);

        setLayout(new BorderLayout());
        setBorder(BorderFactory.createLineBorder(Color.BLACK));
        add(scrollPane);
        add(buttonPanel, BorderLayout.WEST);
    }

    private void activateComponentListener() {
        ((JFrame) SwingUtilities.getWindowAncestor(this)).addComponentListener(new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent arg0) {
                if (popup.isVisible()) {
                    popup.setLocation(arrowButton.getLocationOnScreen().x + arrowButton.getWidth(),
                            arrowButton.getLocationOnScreen().y);
                }
            }
        });
    }

    public void removeElementFromList(Object element) {
        int index = getElementIndex(element);
        if (((DefaultListModel<Object>) getList().getModel()).getElementAt(getElementIndex(element)) != null) {
            ((DefaultListModel<Object>) getList().getModel()).removeElementAt(index);
            getTexts().remove(index);
        }
    }

    public void removeElementFromList(int index) {
        if (((DefaultListModel<Object>) getList().getModel()).getElementAt(index) != null) {
            ((DefaultListModel<Object>) getList().getModel()).removeElementAt(index);
            getTexts().remove(index);
        }
    }

    private Integer getElementIndex(Object element) {
        for (int i = 0; i < ((DefaultListModel<Object>) getList().getModel()).getSize(); i++) {
            if (((DefaultListModel<Object>) getList().getModel()).getElementAt(i).equals(element)) {
                return i;
            }
        }
        return null;
    }

    public void addElementToList(Object element, String text) {
        ((DefaultListModel<Object>) list.getModel()).addElement(element);
        getTexts().add(text);
    }

    public JList<Object> getList() {
        return list;
    }

    public JToggleButton getArrowButton() {
        return arrowButton;
    }

    public ArrayList<String> getTexts() {
        return texts;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM