2017-09-25 2 views
0

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é?

Résultat souhaité: enter image description here

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; 
    } 

} 

} 
+0

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

+0

Ajouter des données à JList et les visualiser dans le moteur de rendu des cellules? Mais pourquoi? Quels sont les avantages? –

+0

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

Répondre

1

Dans votre ListCellRenderer, conditionner la couleur de fond en fonction de la valeur de isSelected. Il est également possible de changer le graphique lui-même. Le fragment ci-dessous met à jour la peinture de fond du graphique; Alternativement, vous pouvez modifier l'alpha d'arrière-plan des parcelles.

static class ListRenderer extends DefaultListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList chartList, Object 
     value, int index, boolean isSelected, boolean cellHasFocus) { 
     ChartPanel chartPanel = (ChartPanel) value; 
     if (isSelected) {chartPanel.getChart().setBackgroundPaint(Color.red);} 
     else {chartPanel.getChart().setBackgroundPaint(Color.white);} 
     return chartPanel; 
    } 
} 

image

+0

Ça a l'air bien. Je vous remercie! –