【问题标题】:Not recognising Color from different class无法识别不同类别的颜色
【发布时间】:2014-10-25 21:03:18
【问题描述】:

所以我想将我的 Rectangle 的颜色设置为 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?");

            }
        });

    }


}

这是完整的代码,Rectangle 包含在其中。

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


    }

}

任何人都可以帮助我并给我一个解决方案为什么它无法识别颜色吗?

【问题讨论】:

  • 尽快发布MCVE 以获得更好的帮助
  • 也许你需要在挑选颜色后致电repaint()
  • @khelwood 不起作用 :(
  • 正如我昨天所说,您需要将颜色从TestProjectJPanel 传递给负责绘制它的组件,然后在组件上调用repaint 以通知重绘管理器该组件需要重新粉刷
  • 糟糕,抱歉。我会编辑它。它是 TestProjectJPanel 对象

标签: java colors jpanel


【解决方案1】:

如果没有 runnable example 来证明您的问题,就不可能 100% 确定,但从它的声音来看,您已经创建了两个 TestProjectJPanel 和/或油漆面板的实例,所以您认为您的重新绘制到实际上不在屏幕上。

但是,听起来您并没有遵循基本的 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();
        }

    }

}

【讨论】:

  • 所以我必须创建 setfillColor(Color fillColor) 然后将paintPane.setFillColor(color) 添加到我的程序中?
  • 这是我的建议,矩形的颜色应该由绘图面板管理
  • 嗯,好的,我现在就试试,谢谢 :) 还有什么要补充的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多