我在这个网站上看到了一段代码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();
};
}
}
答案 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();
}
});
}
}