Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的颜色+;Java+;颜色选择器_Java_Swing - Fatal编程技术网

奇怪的颜色+;Java+;颜色选择器

奇怪的颜色+;Java+;颜色选择器,java,swing,Java,Swing,它创建一个窗口,方法“绘制”绘制第一个矩形在创建窗口颜色选择后,我选择颜色(红色)并绘制第二个矩形…黑色 为什么? 当swing确定组件需要重新绘制时,将调用组件的绘制方法 因此,可能正在发生的是,在创建和显示帧时,会立即调用is paint()。此时图形颜色恰好为黑色 然后,设置颜色并在图形对象上调用“drawRect”。没有任何事情发生,因为您不在绘制方法中。在接下来的某个时刻,swing确定它需要重新绘制框架,并使用新初始化的图形对象调用它的方法。它的颜色设置为默认的黑色。你会得到另一个黑

它创建一个窗口,方法“绘制”绘制第一个矩形在创建窗口颜色选择后,我选择颜色(红色)并绘制第二个矩形…黑色
为什么?

当swing确定组件需要重新绘制时,将调用组件的绘制方法

因此,可能正在发生的是,在创建和显示帧时,会立即调用is paint()。此时图形颜色恰好为黑色

然后,设置颜色并在图形对象上调用“drawRect”。没有任何事情发生,因为您不在绘制方法中。在接下来的某个时刻,swing确定它需要重新绘制框架,并使用新初始化的图形对象调用它的方法。它的颜色设置为默认的黑色。你会得到另一个黑色矩形

解决方案是向Fr对象添加一个字段。例如“矩形颜色”。您的JColorChooser应该更新此字段。调用Fr的paint时,它应该引用此属性来设置图形颜色

如果要强制组件重新绘制自身,则应该对其调用repaint()方法


最后,设置
gr=getGraphics()
毫无意义。您已经在绘制方法中传递了一个初始化的图形对象。

当swing确定需要重新绘制组件时,将调用该组件的绘制方法

因此,可能正在发生的是,在创建和显示帧时,会立即调用is paint()。此时图形颜色恰好为黑色

然后,设置颜色并在图形对象上调用“drawRect”。没有任何事情发生,因为您不在绘制方法中。在接下来的某个时刻,swing确定它需要重新绘制框架,并使用新初始化的图形对象调用它的方法。它的颜色设置为默认的黑色。你会得到另一个黑色矩形

解决方案是向Fr对象添加一个字段。例如“矩形颜色”。您的JColorChooser应该更新此字段。调用Fr的paint时,它应该引用此属性来设置图形颜色

如果要强制组件重新绘制自身,则应该对其调用repaint()方法


最后,设置
gr=getGraphics()
毫无意义。您已经在paint方法中向您传递了一个初始化的图形对象。

您不应该重写JFrame的paint()方法


请阅读上Swing教程中的章节,以获取有关自定义绘制的示例。

决不应重写JFrame的paint()方法

import javax.swing.*;
import java.awt.*;

public class Fr extends JFrame{

    Fr(String s){
        super(s);
        setSize(200,300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics gr){
        gr=getGraphics();
        gr.fillRect(50, 50, 20, 20);
    }

    public static void main(String[] args){
        Fr f=new Fr("Window");
        f.getGraphics().setColor(JColorChooser.showDialog(null,"Color",null));
        f.getGraphics().fillRect(100,100,20,20);
    }
}
请阅读上Swing教程中的章节,以获取有关自定义绘制的示例

import javax.swing.*;
import java.awt.*;

public class Fr extends JFrame{

    Fr(String s){
        super(s);
        setSize(200,300);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void paint(Graphics gr){
        gr=getGraphics();
        gr.fillRect(50, 50, 20, 20);
    }

    public static void main(String[] args){
        Fr f=new Fr("Window");
        f.getGraphics().setColor(JColorChooser.showDialog(null,"Color",null));
        f.getGraphics().fillRect(100,100,20,20);
    }
}
谢谢多伦多的家伙=)

谢谢多伦多的家伙=)