2015-05-21 75 views
0

我的項目有一點問題,我不知道如何處理setColor選項,在這種情況下我嘗試。 主要的問題是,我不能給paintComponent礦石的顏色,我不知道該怎麼做。我從Scatterplot(Scatterplot sp = new Scatterplot)創建一個對象不起作用。paintComponent如何從外面設置顏色

這裏是我的代碼爲plotPanel。

public class Scatterplot extends JPanel { 

    List<Double> values_x = new ArrayList<>(); 
    List<Double> values_y = new ArrayList<>(); 

    protected double maxValue_x, minValue_x, maxValue_y, minValue_y; 


    public Scatterplot(List<Double> variableValues_1, List<Double> variableValues_2) { 
     values_x = variableValues_1; 
     maxValue_x = Collections.max(values_x); 
     minValue_x = Collections.min(values_x); 

     values_y = variableValues_2; 
     maxValue_y = Collections.max(values_y); 
     minValue_y = Collections.min(values_y); 

    } 



    @Override 
    protected void paintComponent(Graphics g) { 

     int m = 30; 
     double width = getWidth(); 
     double height = getHeight(); 

     double x1 = (width-2*m)/(maxValue_x - minValue_x); 
     double y1 = (height-2*m)/(maxValue_y - minValue_y); 

     for (int i = 0; i < values_x.size(); i++) { 
      double value_x = values_x.get(i); 
      double value_y = values_y.get(i); 

      g.fillOval((int)(2*m + x1*(value_x-minValue_x)-2*m), (int)(height - (y1*(value_y-minValue_y))-2*m), 2*m, 2*m); 

     } 
    }  
} 

供JColorChooser在這裏實現:

public class GuiOptionPanel extends JPanel { 


    public GuiOptionPanel(DataModel dataModel) { 
     JPanel optionPanel = new JPanel(new GridLayout(7,1)); 

     JPanel menuPanel = new JPanel(); 
     JLabel menuLabel = new JLabel("Menu"); 
     menuLabel.setFont(menuLabel.getFont().deriveFont(Font.BOLD)); 
     menuPanel.add(menuLabel); 
     optionPanel.add(menuPanel); 

     JButton setColorButton = new JButton("Set Color"); 
     optionPanel.add(setColorButton); 
     setColorButton.addActionListener((ActionEvent e) -> { 
      JColorChooser.showDialog(null, "Color", null); 
     }); 

     add(optionPanel); 
    } 
} 

這是所有(和一些更多的面板)加入到一個Frame:

public GuiFrame(DataModel dataModel) { 
    setSize(FRAME_WIDTH, FRAME_HIGHT); 
    /** 
    * Create Objects 
    */ 
    GuiInfoPanel ip = new GuiInfoPanel(dataModel); 
    GuiOptionPanel op = new GuiOptionPanel(dataModel); 
    JComponent sp = new Scatterplot(dataModel.getVariableValues(0), dataModel.getVariableValues(1)); 
    JComponent hg1 = new Histograms(dataModel.getVariableValues(0)); 
    JComponent hg2 = new Histograms(dataModel.getVariableValues(1)); 
    /** 
    * Create Panels 
    */ 
    createMainPanel(); 

    /** 
    * Add Panels 
    */ 
    this.add(mainPanel); 
    this.add(ip, BorderLayout.SOUTH); 
    menuPanel.add(op, BorderLayout.NORTH); 
    scatterplotPanel.add(sp, BorderLayout.CENTER); 
    histogram1.add(hg1, BorderLayout.CENTER); 
    histogram2.add(hg2, BorderLayout.CENTER); 
    } 

的daterModel類(這是由返回接口):

package dataplotproject; 

import java.util.ArrayList; 
import java.util.List; 

public class DataModel { 

    List<Variable> listOfEveryVariable = new ArrayList<>(); 
    String fileName = ""; 

    public DataModel(List<Variable> listOfEveryVariable2, String fileName2) { 
     listOfEveryVariable = listOfEveryVariable2; 
     fileName = fileName2; 
    } 

    public List<Variable> getVariables() { 
     return listOfEveryVariable; 
    } 

    public String getFileName() { 
     return fileName; 
    } 

    public List<String> getVariableNames() { 
     List<String> names = new ArrayList<>(); 
     for (Variable obj : listOfEveryVariable) { 
      names.add(obj.getName()); 
     } 
     return names; 
    } 

    public List<Double> getVariableValues(int i){ 
     return listOfEveryVariable.get(i).getValueList(); 
    } 
} 

回答

0

這是有很多似是而非的答案的一個寬泛的問題:這裏的做到這一點的一種方法:

  1. 提供的散點圖一個Color實例變量(一個setter方法和色值)
  2. 使用(1)坐落在散點圖的paintComponent方法裏面演色如以前g.setColor(myColor);
  3. 傳遞Scatterplot對象的引用GuiOptionPanel
  4. 在ActionListener的實現中GuiOptionPanel,則JColorChooser.showDialog方法返回一個顏色對象。將其分配給一個變量。 Color chosenColor = JColorChooser.showDialog(null, "Color", null);
  5. 通行證顏色(4)向Scatterplot從(1)和(3)

注意,顏色從JColorChooser.showDialog返回可以爲空,如果取消用戶的設置器方法 - 應該添加有條件確保它不是null。如果您希望顏色變化立即生效,您還應該在(1)的顏色設置器方法中調用repaint

+0

我試過,但問題是,我不能創建一個對象Scatterplot sp = new Scatterplot我的IDE說:「構造函數Scatterplot在類Scatterplot不能用於給類型」 – Dusius

+0

這似乎是一個問題與您的問題無關。 Scatterplot類有一個接受2個列表的構造函數 - 你傳遞了正確的數據類型嗎? (你的'DataModel'類沒有發佈,所以我們不能說) – copeg

+0

我添加了dataModel類 – Dusius

0

如果我理解正確的話,你可能想這樣做:

@Override 
protected void paintComponent(Graphics g) { 
g.setColor(Color.BLACK); 
[..] 
} 

換句話說,一個組件是由它的圖形對象,它可以處理類似顏色的東西畫。

+0

我有一個JColorChooser在「公共類GuiOptionPanel擴展JPanel」,我想從那裏設置顏色到paintComponent。 – Dusius