简体   繁体   English

在 java AWT 中更改已绘制图形 object 的颜色不起作用

[英]change color of already drawn Graphics object in java AWT not working

Am trying to change color after drawing the object in window, this is what i came up with, am a beginner so this is messy.在 window 中绘制 object 后,我试图改变颜色,这就是我想出的,我是初学者,所以这很混乱。

import java.awt.*;
import java.awt.event.*;
import java.awt.event.WindowEvent;
import java.util.Arrays;
import java.util.List;
public class TestGraphic extends Figure {

TestGraphic(){
    setSize(600,600);
    closeFrame();
}

public static void main(String[] args) {
    TestGraphic test = new TestGraphic();
    test.setVisible(true);

}
public void paint(Graphics gui) {
    drawComponent(gui);
    
}
public void drawComponent(Graphics gui) {
     gui.drawOval(108,110,200,200);
     gui.drawOval(160,150,20,20);
     gui.drawOval(240,150,20,20);
     gui.drawRect(160,220,100,40);
     Button btn = new Button("Change color");
     btn.setBounds(30,100,80,30);
     add(btn);
     changeColor(gui,btn);
    
     
}
@Override
void draw(Graphics gui) {
    // TODO Auto-generated method stub
    
}
@Override
public boolean contains(int x, int y) {
      
      return false;
}
 private void closeFrame(){
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      }); 
 }
 

 void changeColor(Graphics gui,Button btn) {
     List<Color> colorList;
     colorList = Arrays.asList(Color.black, Color.blue , Color.cyan, Color.red, Color.green, Color.magenta, Color.orange, Color.yellow);
      
      btn.addActionListener(new ActionListener() { 
             public void actionPerformed (ActionEvent e) {  
                 for(int i = 0;i < colorList.size(); i++) {
                    gui.setColor(colorList.get(i));
                }
                  }    
              }); 
     
    
}

} }

The class Figure is an abstract class that is inheriting from java.awt.Frame Any remarks about how to make this code cleaner will be appreciated, thanks. class是一个抽象的 class 继承自java.awt.Frame任何有关如何使此代码更清晰的评论将不胜感激,谢谢。

Before you begin on something as complex as custom painting, make sure you have a firm understanding of the basics of the language and the APIs在开始像自定义绘画这样复杂的事情之前,请确保您对语言和 API 的基础知识有深刻的理解

See Creating a GUI With Swing , Performing Custom Painting and Painting in AWT and Swing for more details.有关更多详细信息,请参阅使用 Swing 创建 GUI在 AWT 和 Swing执行自定义绘画和绘画。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Color desiredColor = Color.BLACK;
        private List<Color> avaliableColors = new ArrayList<>(16);

        public TestPane() {
            setLayout(new BorderLayout());
            avaliableColors.add(Color.BLACK);
            avaliableColors.add(Color.BLUE);
            avaliableColors.add(Color.CYAN);
            avaliableColors.add(Color.DARK_GRAY);
            avaliableColors.add(Color.GRAY);
            avaliableColors.add(Color.GREEN);
            avaliableColors.add(Color.LIGHT_GRAY);
            avaliableColors.add(Color.MAGENTA);
            avaliableColors.add(Color.ORANGE);
            avaliableColors.add(Color.PINK);
            avaliableColors.add(Color.RED);
            avaliableColors.add(Color.WHITE);
            avaliableColors.add(Color.YELLOW);

            JButton btn = new JButton("Change color");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Randomise the colors
                    Collections.shuffle(avaliableColors);
                    desiredColor = avaliableColors.get(0);
                    repaint();
                }
            });
            add(btn, BorderLayout.SOUTH);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(desiredColor);
            g2d.drawOval(108, 110, 200, 200);
            g2d.drawOval(160, 150, 20, 20);
            g2d.drawOval(240, 150, 20, 20);
            g2d.drawRect(160, 220, 100, 40);
            g2d.dispose();
        }

    }
}

Since you're just starting out, I might suggest getting started with JavaFX instead由于您刚刚开始,我可能建议您开始使用JavaFX

AWT AWT

!! !! Warning !!警告 !!

No one uses AWT anymore and you're not likely to get much in the way of support for it here.没有人再使用 AWT,而且您在这里也不太可能获得太多支持。 This is a "basic" concept converted from the previous example, beware, AWT isn't double buffered by default这是从上一个示例转换而来的“基本”概念,请注意,默认情况下 AWT 不是双缓冲的

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Frame frame = new Frame();
                frame.add(new TestCanvas());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestCanvas extends Container {

        private Color desiredColor = Color.BLACK;
        private List<Color> avaliableColors = new ArrayList<>(16);

        public TestCanvas() {
            setLayout(new BorderLayout());
            avaliableColors.add(Color.BLACK);
            avaliableColors.add(Color.BLUE);
            avaliableColors.add(Color.CYAN);
            avaliableColors.add(Color.DARK_GRAY);
            avaliableColors.add(Color.GRAY);
            avaliableColors.add(Color.GREEN);
            avaliableColors.add(Color.LIGHT_GRAY);
            avaliableColors.add(Color.MAGENTA);
            avaliableColors.add(Color.ORANGE);
            avaliableColors.add(Color.PINK);
            avaliableColors.add(Color.RED);
            avaliableColors.add(Color.WHITE);
            avaliableColors.add(Color.YELLOW);

            JButton btn = new JButton("Change color");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // Randomise the colors
                    Collections.shuffle(avaliableColors);
                    desiredColor = avaliableColors.get(0);
                    repaint();
                }
            });
            add(btn, BorderLayout.SOUTH);
        }

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

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(desiredColor);
            g2d.drawOval(108, 110, 200, 200);
            g2d.drawOval(160, 150, 20, 20);
            g2d.drawOval(240, 150, 20, 20);
            g2d.drawRect(160, 220, 100, 40);
            g2d.dispose();
        }

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM