0
我有JList
的ChartPanel
s。当我试图选择元素时,我无法直观地看到列表中实际选择了哪些元素。在节目级听众正在正常工作。如何获取JList中的选定面板元素(覆盖选定的元素)
如何从视觉上选择我的图表面板列表?或者如何用不透明颜色叠加这些元素?
这里是在此基础上example代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.util.Random;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/**
* @see https://stackoverflow.com/a/40445144/230513
*/
public class ThumbnailChartsJList{
public static JScrollPane scrollPane;
public static JList chartList;
private static final int W = 200;
private static final int H = W;
private static final int N = 100;
private static final int NumberCharts = 20;
private static final Random random = new Random();
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame f = new JFrame("Test");
JPanel panel = new JPanel(new BorderLayout());
ChartPanel chartp = createChart();
DefaultListModel listModel = new DefaultListModel();
for (int i=0; i<NumberCharts; i++){
listModel.addElement(chartp);
}
chartList = new JList(listModel);
chartList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
chartList.setCellRenderer(new ListRenderer());
chartList.setVisibleRowCount(0); //0 - dynamic rows
chartList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
chartList.setSelectionForeground(Color.RED);
scrollPane = new JScrollPane(chartList,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
panel.add(scrollPane, BorderLayout.CENTER);
f.setPreferredSize(new Dimension(900,700));
f.setContentPane(panel);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
});
}
private static ChartPanel createChart() {
final XYSeries series = new XYSeries("Data");
for (int i = 0; i < random.nextInt(N) + N; i++) {
series.add(i, random.nextGaussian());
}
XYSeriesCollection dataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart("Random", "Domain",
"Range", dataset, PlotOrientation.VERTICAL, false, false, false);
ChartPanel chartPanel = new ChartPanel(chart, W, H, W, H, W, H,
false, true, true, true, true, true){
@Override
public Dimension getPreferredSize() {
return new Dimension(W, H);}
};
chartPanel.getChart().removeLegend();
return chartPanel;
}
static class ListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList chartList, Object
value, int index, boolean isSelected, boolean cellHasFocus) {
return (ChartPanel) value;
}
}
}
不要组件添加到'JList' /'ListModel',添加您需要表示的数据,然后使用'ListCellRenderer'提供可视化 - 这样做会给你控制您需要呈现选择 – MadProgrammer
将数据添加到JList并在单元格渲染器中将其可视化?但为什么?有什么优势? –
速度更快(通常),它可以减少内存开销,并让您控制元素在不同状态下的呈现方式 - 这也是API设计使用的方式 – MadProgrammer