【问题标题】:paintComponent how to setColor from outsidepaintComponent 如何从外部设置颜色
【发布时间】:2015-08-03 09:48:08
【问题描述】:

我的项目有一点问题,我不知道在这种情况下如何处理 setColor 选项。 主要问题是我无法为paintComponent 提供颜色,我不知道该怎么做。我从 Scatterplot (Scatterplot sp = new Scatterplot) 创建的对象不起作用。

这是我的 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);
    }
}

这就是添加到框架中的所有(以及更多面板):

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

【问题讨论】:

    标签: java swing paintcomponent jcolorchooser


    【解决方案1】:

    如果我理解正确,您可能想要这样做:

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

    换句话说,一个组件是由它的 Graphics 对象绘制的,该对象处理诸如颜色之类的事情。

    【讨论】:

    • 我在“公共类 GuiOptionPanel 扩展 JPanel”中有一个 JColorChooser,我想从那里设置颜色到paintComponent。
    【解决方案2】:

    这是一个宽泛的问题,有很多似是而非的答案:这里有一种方法:

    1. 在散点图中提供Color 实例变量(带有setter 方法和默认颜色值)
    2. 在渲染之前使用 (1) 在 Scatterplot 的 paintComponent 方法中设置颜色,例如 g.setColor(myColor);
    3. Scatterplot 对象的引用传递给GuiOptionPanel
    4. GuiOptionPanel 内的ActionListener 实现中,JColorChooser.showDialog 方法返回一个Color 对象。将其分配给一个变量。 Color chosenColor = JColorChooser.showDialog( null, "Color", null );
    5. 将颜色从 (4) 传递到 (1) 和 (3) 的 Scatterplot 的 setter 方法

    请注意,如果用户取消,从 JColorChooser.showDialog 返回的颜色可能为空 - 应添加条件以确保它不是 null。如果您希望颜色更改立即生效,您还应该在 (1) 的颜色设置器方法中调用 repaint

    【讨论】:

    • 我试过了,但问题是我无法创建一个对象 Scatterplot sp = new Scatterplot 我的 IDE 说“类 Scatterplot 中的构造函数 Scatterplot 不能应用于提供类型”
    • 这似乎是与您的问题无关的问题。 Scatterplot 类有一个接受 2 个列表的构造函数 - 您是否传递了正确的数据类型? (您的DataModel 课程没有发布,所以我们无法判断)
    • 我添加了dataModel类
    • 快速浏览我在当前代码中看不到任何会导致编译器错误的内容。您是否尝试在没有必要参数的情况下在其他地方创建散点图对象? (这似乎是一个无关的问题)。
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 2015-03-28
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多