J'ai un JList
de ChartPanel
s. Lorsque j'essaie de sélectionner des éléments, je ne peux pas voir visuellement quels éléments de la liste sont effectivement sélectionnés. Au niveau du programme, les auditeurs fonctionnent correctement.Comment obtenir les éléments sélectionnés des panneaux dans JList (superposer les éléments sélectionnés)
Comment obtenir visuellement mes panneaux de la liste? Ou comment superposer ces éléments avec la couleur d'opacité?
Voici le code basé sur ce 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;
}
}
}
Ne pas ajouter des composants à un 'JList' /' ListModel', ajouter les données dont vous avez besoin et ensuite utiliser représentiez un 'ListCellRenderer' pour fournir une visualisation - Cela vous donnera le contrôle vous devez rendre la sélection – MadProgrammer
Ajouter des données à JList et les visualiser dans le moteur de rendu des cellules? Mais pourquoi? Quels sont les avantages? –
Il est plus rapide (en général) de réduire la surcharge mémoire et de contrôler le rendu des éléments dans différents états - c'est aussi la manière dont l'API a été conçue pour être utilisée – MadProgrammer