2017-09-25 152 views
0

我有JListChartPanel s。當我試圖選擇元素時,我無法直觀地看到列表中實際選擇了哪些元素。在節目級聽衆正在正常工作。如何獲取JList中的選定面板元素(覆蓋選定的元素)

如何從視覺上選擇我的圖表面板列表?或者如何用不透明顏色疊加這些元素?

期望的結果: enter image description here

這裏是在此基礎上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

不要組件添加到'JList' /'ListModel',添加您需要表示的數據,然後使用'ListCellRenderer'提供可視化 - 這樣做會給你控制您需要呈現選擇 – MadProgrammer

+0

將數據添加到JList並在單元格渲染器中將其可視化?但爲什麼?有什麼優勢? –

+0

速度更快(通常),它可以減少內存開銷,並讓您控制元素在不同狀態下的呈現方式 - 這也是API設計使用的方式 – MadProgrammer

回答

1

在你ListCellRenderer,調節基礎上的isSelected值的背景色。也可以更改圖表本身。下面的片段更新了圖表的背景顏色;或者,您可以更改繪圖的背景Alpha。

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

看起來不錯。謝謝! –