Java 无法识别不同类别的颜色

Java 无法识别不同类别的颜色,java,colors,jpanel,Java,Colors,Jpanel,因此,我想将矩形的颜色设置为JColorChooser选择的任何颜色,但不幸的是,我认为它不会识别它,因为它只是保持黑色,除非我为它指定了一种真正的颜色,如color.BLUE 这是一个矩形,应该从另一个类获取颜色: TestProjectJPanel jpp = new TestProjectJPanel(); public void paintComponent(Graphics g){ super.paintComponent(g); Rectangl

因此,我想将矩形的颜色设置为
JColorChooser
选择的任何颜色,但不幸的是,我认为它不会识别它,因为它只是保持黑色,除非我为它指定了一种真正的颜色,如
color.BLUE

这是一个矩形,应该从另一个类获取颜色:

TestProjectJPanel jpp = new TestProjectJPanel();

public void paintComponent(Graphics g){ 
        super.paintComponent(g);

        Rectangle r = new Rectangle(500,300,250,400);
        g.setColor(jpp.bodyColour);
        g.fillRect((int)r.getX(),(int)r.getY(),(int)r.getHeight(),(int)r.getWidth());

        g.setColor(Color.BLUE);
        g.drawString("banana", 50, 60);

    }
这是一个拥有颜色本身的类

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TestProjectJPanel extends JFrame {

    public JButton b;
    public JButton u;
    public JButton l;
    public JButton r;

    public String s;

    public Color color = (Color.WHITE);
    public JPanel panel;
    public Color bodyColour;
    public Color doorColour;
    public Color wheelColour;

    public TestProjectJPanel(){

        JFrame f = new JFrame();

        panel = new JPanel();
        panel.setBackground(color);

        // bodyColour button
        b = new JButton("Body Colour");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                bodyColour = JColorChooser.showDialog(null, "Pick the colour", bodyColour);
                if (bodyColour == null) 
                    bodyColour = Color.RED;

            }
        });

        u = new JButton("Wheel Colour");
        u.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                wheelColour = JColorChooser.showDialog(null, "Pick the colour", wheelColour);
                if (wheelColour == null) 
                    wheelColour = (Color.BLACK);

            }
        });

        l = new JButton("Door Colour");
        l.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                doorColour = JColorChooser.showDialog(null, "Pick the colour", doorColour);
                if(doorColour==null) 
                    doorColour = (Color.RED);

            }
        });

        r = new JButton("Change Name");
        r.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                s = JOptionPane.showInputDialog("What name do you want to change it to?");

            }
        });

    }


}
这是整个代码,
矩形
包含在其中

import javax.swing.*;

import java.util.*;
import java.awt.*;

public class TestProjectDialog extends JPanel {

    TestProjectJPanel jpp = new TestProjectJPanel();


    public void paintComponent(Graphics g) { 
        super.paintComponent(g);

        Rectangle r = new Rectangle(500, 300, 250, 400);

        g.setColor(jpp.bodyColour);

        g.fillRect((int) r.getX(), (int) r.getY(), (int) r.getHeight(), (int) r.getWidth());

        g.setColor(Color.BLUE);

        g.drawString("banana", 50, 60);

    }

    public static void main(String[] args){

        TestProjectJPanel jpp = new TestProjectJPanel();

    /* JOptionPane.showMessageDialog(null, "Just about to draw a REALLY GOOD 2D car \n just need input please.");

    jpp.s = JOptionPane.showInputDialog("Imagine a car, what is it's name?");
    if(jpp.s == null || (jpp.s != null && ("".equals(jpp.s))))   
    {
        JOptionPane.showMessageDialog(null, "Invalid input/pressed cancel, closing program.");
      System.exit(0);
    }
    JOptionPane.showMessageDialog(null, "Ah okay, so it's name is " + jpp.s); */

    JFrame f = new JFrame("My 2D Car Drawing");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jpp.setBackground(Color.WHITE);
    f.setSize(1440,900);
    f.add(new TestProjectDialog(), BorderLayout.CENTER);
    f.add(jpp.b, SpringLayout.SOUTH);  // bodyColour
   // f.add(jpp.u, SpringLayout. NORTH); // wheelColour
   // f.add(jpp.l, SpringLayout.WEST); // doorColour
  //  f.add(jpp.r, SpringLayout.EAST);  // changeName

    f.setVisible(true);


    }

}
有人能帮我解决为什么它不能识别颜色的问题吗?

如果没有一个能证明你的问题的例子,就不可能100%确定,但是从它的声音来看,你又创建了两个
TestProjectJPanel
和/或paint panel的实例,所以你认为你画的东西实际上并不在屏幕上

但是,听起来您并没有坚持基本的OO设计,确保对象是自我管理的,而是允许对象从另一个对象的属性确定其状态

相反,绘制/矩形窗格应该是自包含的,也就是说,它需要的所有属性都应该由它来管理(这也可能包括一个模型,但这超出了当前的问题)

例如,
ControlPane
管理用户(选择颜色)与
PaintPane
上该颜色设置之间的交互,该设置仅处理绘制结果

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ColorTest {

    public static void main(String[] args) {
        new ColorTest();
    }

    public ColorTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                PaintPane paintPane = new PaintPane();
                ControlPane controlPane = new ControlPane(paintPane);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(paintPane);
                frame.add(controlPane, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ControlPane extends JPanel {

        public ControlPane(PaintPane paintPane) {
            JButton colorButton = new JButton("Color");
            add(colorButton);

            colorButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Color color = JColorChooser.showDialog(ControlPane.this, "Background", paintPane.getFillColor());
                    if (color != null)
                        paintPane.setFillColor(color);
                }
            });
        }

    }

    public class PaintPane extends JPanel {

        private Color fillColor = Color.RED;

        public PaintPane() {}

        public Color getFillColor() {
            return fillColor;
        }

        public void setFillColor(Color fillColor) {
            this.fillColor = fillColor;
            repaint();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(fillColor);
            g2d.fillRect(50, 50, 100, 100);
            g2d.dispose();
        }

    }

}

发布一篇文章以获得更好的帮助可能在选择颜色后需要调用
repaint()
。@khelwood不工作:(正如我昨天所说,您需要将
TestProjectJPanel
中的颜色传递给负责绘制它的组件,然后调用组件上的
repaint
,通知重新绘制管理器组件需要重新绘制。对不起,我将在中编辑它。这是TestProjectJPanel对象,因此我必须创建setfillColor(颜色fillColor)然后只需将paintPane.setFillColor(颜色)添加到我的程序中?这是我的建议,矩形的颜色应由PaintPanel管理啊,好的,我现在就试试,谢谢:)我还需要添加什么?