列表显示面板无法正常工作

时间:2015-04-14 15:01:40

标签: java swing user-interface

我在这个网站上看到了一段代码https://stackoverflow.com/a/25170471/230513,它创建了一个面板并将屏幕分成两半。

我想要的是让用户点击图标然后获得确认,然后将其放到Panel 1上。然后用户应该选择另一个图标,然后应该转到面板2.此时,如果用户点击它在两个面板上显示的一个图标。

这是代码;

package GUI;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * @see https://stackoverflow.com/a/25170471/230513
 */
public class ListDisplayPanel extends Component{
    private JPanel contentPane;

    private static final Icon icon = UIManager.getIcon("html.pendingImage");

    private ListPanel listPanel = new ListPanel();
    private DisplayPanel displayPanel1 = new DisplayPanel();
    private DisplayPanel displayPanel2 = new DisplayPanel();
    private JPanel dpHold = new JPanel();

    private class DisplayPanel extends JPanel {

        private static final int SIZE = 256;
        private JLabel label = new JLabel();

        public DisplayPanel() {
            this.add(label);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D temp = (Graphics2D) img.getGraphics();
            icon.paintIcon(this, temp, 0, 0);
            temp.dispose();
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }

    private class ListPanel extends JPanel {

        private static final int N = 5;
        private DefaultListModel dlm = new DefaultListModel();
        private JList list = new JList(dlm);

        public ListPanel() {
            super(new GridLayout());
            for (int i = 0; i < N * N; i++) {
                String name = "Cell-" + String.format("%02d", i);
                dlm.addElement(name);
            }
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            list.setVisibleRowCount(N);
            list.setCellRenderer(new ListRenderer());
            list.addListSelectionListener(new SelectionHandler());
            this.add(list);
        }

        private class ListRenderer extends DefaultListCellRenderer {

            @Override
            public Component getListCellRendererComponent(JList list,
                    Object value, int index, boolean isSelected, boolean cellHasFocus) {
                JLabel label = (JLabel) super.getListCellRendererComponent(
                        list, value, index, isSelected, cellHasFocus);
                label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
                label.setIcon(icon);
                label.setHorizontalTextPosition(JLabel.CENTER);
                label.setVerticalTextPosition(JLabel.BOTTOM);
                return label;
            }
        }

        private class SelectionHandler implements ListSelectionListener {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    displayPanel1.label.setText((String) dlm.getElementAt(e.getLastIndex()));
                    displayPanel2.label.setText((String) dlm.getElementAt(e.getLastIndex()));
                }
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("Generate");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JSplitPane jsp = new JSplitPane();
        jsp.setLeftComponent(new JScrollPane(listPanel));
        JSplitPane jsp2 = new JSplitPane();
        jsp2.setTopComponent(displayPanel1);
        jsp2.setBottomComponent(displayPanel2);
        jsp.setRightComponent(jsp2);
        f.add(jsp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        /*EventQueue.invokeLater(() ->*/ {
            new ListDisplayPanel().display();
        };
    }
}

1 个答案:

答案 0 :(得分:1)

ListSelectionListener的ListSelectionEvent以有趣的方式设置第一个索引和最后一个索引。我使用的是Java 7。

如果您选择的元素小于先前选择的元素,则ListSelectionEvent将更新第一个索引。

如果您选择的元素大于先前选择的元素,则ListSelectionEvent将更新最后一个索引。

即使在JList上指定了单个选择,也会发生这种情况。

我对ListSelectionListener做的另一个更改是添加一个toggle int,以便所选文本首先转到面板1,然后转到面板2,然后转到面板1.

我做了一些其他更改,消除了编译器警告。

package com.ggl.testing;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * @see http://stackoverflow.com/a/25170471/230513
 */
public class ListDisplayPanel extends Component {

    private static final long serialVersionUID = 6728567333943887514L;

    private static final Icon icon = UIManager.getIcon("StockMarket.png");

    private ListPanel listPanel = new ListPanel();
    private DisplayPanel displayPanel1 = new DisplayPanel();
    private DisplayPanel displayPanel2 = new DisplayPanel();

    private class DisplayPanel extends JPanel {

        private static final long serialVersionUID = 7705513454136519778L;

        private JLabel label = new JLabel();

        public DisplayPanel() {
            this.add(label);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (icon == null)
                return;

            BufferedImage img = new BufferedImage(icon.getIconWidth(),
                    icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
            Graphics2D temp = (Graphics2D) img.getGraphics();
            icon.paintIcon(this, temp, 0, 0);
            temp.dispose();
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(300, 200);
        }
    }

    private class ListPanel extends JPanel {

        private static final long serialVersionUID = -6104547005775751025L;

        private static final int N = 5;
        private DefaultListModel<String> dlm = new DefaultListModel<String>();
        private JList<String> list = new JList<String>();

        public ListPanel() {
            super(new GridLayout());
            for (int i = 0; i < N * N; i++) {
                String name = "Cell-" + String.format("%02d", i);
                dlm.addElement(name);
            }
            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
            list.setVisibleRowCount(N);
            list.setCellRenderer(new ListRenderer());
            list.addListSelectionListener(new SelectionHandler());
            list.setModel(dlm);

            this.add(list);
        }

        private class ListRenderer extends DefaultListCellRenderer {

            private static final long serialVersionUID = 1863262304255858334L;

            @SuppressWarnings("rawtypes")
            @Override
            public Component getListCellRendererComponent(JList list,
                    Object value, int index, boolean isSelected,
                    boolean cellHasFocus) {
                JLabel label = (JLabel) super.getListCellRendererComponent(
                        list, value, index, isSelected, cellHasFocus);
                label.setBorder(BorderFactory.createEmptyBorder(N, N, N, N));
                label.setIcon(icon);
                label.setHorizontalTextPosition(JLabel.CENTER);
                label.setVerticalTextPosition(JLabel.BOTTOM);
                return label;
            }
        }

        private class SelectionHandler implements ListSelectionListener {

            private int previousIndex = -1;
            private int whichPanel = 1;

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    int first = e.getFirstIndex();
                    int last = e.getLastIndex();

                    if (first == last) {
                        previousIndex = first;
                    } else if (first == previousIndex) {
                        previousIndex = last;
                    } else {
                        previousIndex = first;
                    }

                    if (whichPanel == 1) {
                        displayPanel1.label.setText(dlm.get(previousIndex));
                        whichPanel = 2;
                    } else if (whichPanel == 2) {
                        displayPanel2.label.setText(dlm.get(previousIndex));
                        whichPanel = 1;
                    }
                }
            }

        }
    }

    private void display() {
        JFrame f = new JFrame("Generate");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JSplitPane jsp = new JSplitPane();
        jsp.setLeftComponent(new JScrollPane(listPanel));
        JSplitPane jsp2 = new JSplitPane();
        jsp2.setTopComponent(displayPanel1);
        jsp2.setBottomComponent(displayPanel2);
        jsp.setRightComponent(jsp2);
        f.add(jsp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

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