Saya mencoba mengubah warna setelah menggambar objek di jendela, inilah yang saya dapatkan, saya seorang pemula jadi ini berantakan.

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

}

Kelas Gambar adalah kelas abstrak yang diturunkan dari java.awt.Frame Setiap komentar tentang cara membuat kode ini lebih bersih akan dihargai, terima kasih.

0
Marwane 26 November 2021, 23:52
2
Jawaban dasarnya adalah, Anda tidak. Dan tentu saja Anda tidak mencoba dan melakukannya dengan cara Anda. Jangan ubah status UI dari dalam pass cat (seperti menambahkan tombol). Mengapa Anda menggunakan AWT? Mengapa tidak Swing atau event JavaFX?
 – 
MadProgrammer
26 November 2021, 23:57
2
Setiap komentar tentang cara membuat kode ini lebih bersih 1) Jangan gunakan AWT. Alih-alih gunakan Swing atau JavaFX. 2) Jika menggunakan Swing, baca tutorial Swing. Ada bagian di Custom Painting dan How to Use Timers yang akan membantu menganimasikan warna Anda. 3) Jangan membuat komponen dalam metode pengecatan. Komponen harus dibuat dan ditambahkan ke bingkai di konstruktor kelas Anda.
 – 
camickr
26 November 2021, 23:59
Profesor java kami memaksa kami untuk bekerja dengan AWT :( !
 – 
Marwane
27 November 2021, 00:05
Saatnya mencari guru baru. Sementara AWT merupakan dasar dari Swing, hampir tidak ada yang benar-benar menggunakannya lagi
 – 
MadProgrammer
27 November 2021, 00:06
Saya harus menggunakan AWT :(
 – 
Marwane
27 November 2021, 00:06

1 menjawab

Jawaban Terbaik

Sebelum Anda memulai sesuatu yang rumit seperti lukisan kustom, pastikan Anda memiliki pemahaman yang kuat tentang dasar-dasar bahasa dan API

Lihat Membuat GUI Dengan Swing, Melakukan Lukisan Kustom dan Melukis dengan AWT dan Swing untuk detail selengkapnya.

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

    }
}

Karena Anda baru memulai, saya mungkin menyarankan untuk memulai dengan JavaFX sebagai gantinya

AWT

!! Peringatan !!

Tidak ada yang menggunakan AWT lagi dan Anda tidak akan mendapatkan banyak dukungan untuk itu di sini. Ini adalah konsep "dasar" yang dikonversi dari contoh sebelumnya, berhati-hatilah, AWT tidak buffer ganda secara default

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

    }
}
1
MadProgrammer 27 November 2021, 00:14
Terima kasih telah membantu! Saya hanya ingin bertanya, mengapa Anda menggunakan 2 kelas, dan operasi apa yang dilakukan secara otomatis selain metode paint ? Terima kasih sebelumnya.
 – 
Marwane
27 November 2021, 13:15