Zmiana koloru wskazówek

0

Witam. Mam zegarek analogowy i chcę go przerobić na komponent. Chcę aby za pomocą seterów i geterów zmieniał się kolor wskazówek. Poniżej wklejam mój kod:

kod zegarek.java:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.Calendar;
import javax.swing.*;
import static java.lang.Math.*;

class ClockComponent extends JComponent{

        //zmienne prywatne
	private Calendar systemTime = Calendar.getInstance();
	private int centerX = 200 ;
	private int centerY = 200;
        private String kolor;
        private Color tloKolor;
	BufferedImage clockFace ;
	
        //konstruktor bezparametrowy public ClockComponent(){};
        public ClockComponent(){};
	
      public void setKolor (Color R) {tloKolor=R;}
      public Color getKolor () {return tloKolor;}
   
      
        
       
        
        @Override
	public void paint(Graphics g){
                 //rysowanie ogólnego wyglądu zegarka
		Graphics2D graphics = (Graphics2D)g;
                //włączenie antialiasingu aby grafika ładniej wyglądała
		graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		if (clockFace==null) {
                        //wczytanie obrazka z tarczą
			clockFace = new BufferedImage(400, 400, BufferedImage.BITMASK);
			Graphics2D face = clockFace.createGraphics();
			face.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			drawTiks(face);
                        
                        //szerokość piura  
			BasicStroke width = new BasicStroke(3);
			face.setStroke(width);
			face.setPaint(Color.BLACK);
			//face.drawOval(0, 0, 400, 400);
			drawHands(face, 0, 0, 0, 10);
		}

		graphics.drawImage(clockFace, null, 0, 0);
		drawSecond(graphics);
		drawMinute(graphics);
		drawHour(graphics);
		
	}
        //parametry wskazówki sekund
	private void drawSecond(Graphics2D graphics){
		int seconds = systemTime.get(Calendar.SECOND);//pobieranie sekund z kalendarza
		int secondsAngle = seconds*6;//ustawienie kąta dla wskazówki
		drawHands(graphics, -30, 160, secondsAngle,1);//rysowanie wskazówki
	}
        //parametry wskazówki minut
	private void drawMinute(Graphics2D graphics){
		int minutes = systemTime.get(Calendar.MINUTE);//pobieranie minut z kalendarza
		double minuteAngle = (minutes)*6;//ustawienie kąta dla wskazówki
		drawHands(graphics, 0, 150, minuteAngle,2);//rysowanie wskazówki
	}

        //parametry wskazówki godzin
	private void drawHour(Graphics2D graphics){
		int hours = systemTime.get(Calendar.HOUR); //pobieranie godziny z kalendarza
		double hourAngle = (hours+ (double)(systemTime.get(Calendar.MINUTE))/60)*30; //ustawienie kąta dla wskazówki
		drawHands(graphics, 0, 110, hourAngle,4);//rysowanie wskazówki
	}
        
        //rysowanie wskazówek
	private void drawTiks(Graphics2D graphics){
		int x=0;
		
		while(true){
			int y =180;
			if(x%30==0)y=170;
			drawHands(graphics, y, 180, x,2);
			if (x==360) break;
			x += 6;

		}
	}


	//ustawienia wyglądu wskazówki
	private void drawHands(Graphics2D graphics, int startRadius, int endRadius, double teta,int width){

		double radian = toRadians(teta-90);
		int startX = centerX+ (int)(startRadius*cos(radian));
		int startY = centerY+ (int)(startRadius*sin(radian));
		int endX = centerX+ (int)(endRadius*cos(radian));
		int endY = centerY+ (int)(endRadius*sin(radian));
        

                BasicStroke line = new BasicStroke(width,BasicStroke.JOIN_ROUND,BasicStroke.CAP_ROUND);
		graphics.setStroke(line);
		graphics.setColor(tloKolor);
		graphics.drawLine(startX, startY, endX, endY);
                
	}

	ActionListener update = new ActionListener() {

		public void actionPerformed(ActionEvent e) {
			systemTime.setTimeInMillis(System.currentTimeMillis());
			repaint();
		}
	};


	Timer fireUpdate = new Timer(1000, update);
}


kod okno.java:

import java.awt.Color;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Admin
 */
public class okno extends javax.swing.JFrame {

    /**
     * Creates new form okno
     */
    public okno() {
        initComponents();
        ClockComponent clock = new ClockComponent();
		clock.setSize(600, 600);
		jPanel1.add(clock);
		clock.fireUpdate.start();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jColorChooser1 = new javax.swing.JColorChooser();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jComboBox1 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/clock.png"))); // NOI18N

        jLabel2.setText("Ustaw kolor zegara");

        jButton1.setText("Zmień");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ZmienKolor(evt);
            }
        });

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "RED", "GREEN" }));

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addGap(0, 0, Short.MAX_VALUE))
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(134, 134, 134))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addContainerGap(112, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    private void ZmienKolor(java.awt.event.ActionEvent evt) {
       ClockComponent kolor = new ClockComponent();
       String stringR = jComboBox1.getSelectedItem().toString();
       if (stringR.equals("RED")) {
                jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/clock1.png")));
                
                } 
                else if (stringR.equals("GREEN")){
                Color S = Color.GREEN;
                kolor.setKolor(S);
                jButton1.setBackground(S);
                kolor.repaint();
                }
       
         
       
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new okno().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JColorChooser jColorChooser1;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration
}

Czy jest ktoś w stanie mi pomóc??

0

Ja nie widzę problemu. Zrób pole które będzie przechowywało kolor wskazówek i użyj tego pola przy rysowaniu ustawiając kolor pędzla. Dziedziczysz już po JComponent więc jest ok.

0

A mógłbyś mi powiedzieć jak to zrobić bo jestem początkującym w javie i nie bardzo wiem o co chodzi

0

Przejrzałem mój kod i mam takie pole. Jest problem z ponownym przerysowaniem, które nie chce mi działać. Pomoże ktoś?

1 użytkowników online, w tym zalogowanych: 0, gości: 1