Avatar billede keet Nybegynder
12. november 2003 - 14:03 Der er 18 kommentarer og
1 løsning

JLabel med Icon cirkel

Jeg har en JLabel label, hvor jeg skal have lavet en cirkel, og det skal laves sådan at det er rimeligt nemt at ændre farven på cirklen vha. forskellige knapper. Hvordan laver jeg det Icon som skal være argumentet i new JLabel()?
Avatar billede keet Nybegynder
12. november 2003 - 14:33 #1
Bliver jeg nød til at lave en klasse, der implementerer Icon? Og så få metoden paintIcon() til at tegne min cirkel?
Avatar billede _carsten Nybegynder
12. november 2003 - 14:52 #2
Jeg ville bare lave en klasse som extender JLabel og override paint()

Se eksempel:

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

public class Test extends javax.swing.JFrame {
   
    public Test() {
        initComponents();
        setSize(250,250);
    }
   
    private void initComponents() {
        myLabel1 = new Dokumenter.MyLabel();
        jButton1 = new javax.swing.JButton();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getContentPane().add(myLabel1, java.awt.BorderLayout.CENTER);

        jButton1.setText("Skift cirklens farve");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                changeCircleColor(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void changeCircleColor(java.awt.event.ActionEvent evt) {
        myLabel1.changeColor();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new Test().show();
    }
   
    private javax.swing.JButton jButton1;
    private Dokumenter.MyLabel myLabel1; 
}






class MyLabel extends javax.swing.JLabel {
   
    private java.awt.Color circleColor = Color.GREEN;

    public MyLabel() {
        super();
    }
   
    public void paint(Graphics g){

        int width = this.getWidth();
        int height = this.getHeight();
        int diameter = 0;
       
        if(height < width)
            diameter = height;
        else
            diameter = width;
           
        g.setColor(circleColor);
        g.fillOval((width/2) - (diameter/2),
                  (height/2) - (diameter/2),
                  diameter, diameter);
    }
   
    public void changeColor(){
        JColorChooser chooser = new JColorChooser();
        circleColor = chooser.showDialog(this, "Vælg farve", circleColor);
    }
}
Avatar billede keet Nybegynder
12. november 2003 - 15:06 #3
Jeg har lavet det sådan, at jeg har lavet en klasse der hedder CircelIcon som implementerer Icon. Ved du så evt. hvordan jeg skifter farven i dette tilfælde?
Avatar billede keet Nybegynder
12. november 2003 - 15:07 #4
lidt kode:
Icon icon = new CircelIcon(20);
Label labelCircel = new JLabel( icon );
Avatar billede keet Nybegynder
12. november 2003 - 15:09 #5
Er det ikke noget med der er en metode der hedder repaint()?
Avatar billede _carsten Nybegynder
12. november 2003 - 15:17 #6
Jeg har godt nok aldrig gjort det på den måde, men du skifter farven ved at skifte farve på dit Graphics object.

Graphics g;
g.setColor(Color.GREEN);
Avatar billede _carsten Nybegynder
12. november 2003 - 15:19 #7
Jo - og dit tilfælde må det blive:  labelCircel.repaint();
Avatar billede keet Nybegynder
12. november 2003 - 15:25 #8
hvor definerer jeg så den nye farve?
Avatar billede _carsten Nybegynder
12. november 2003 - 15:28 #9
Det må du kunne gøre i din

    public void paintIcon(Component c, Graphics g, int x, int y){
        g.setColor(Color.GREEN);

    }
Avatar billede _carsten Nybegynder
12. november 2003 - 15:29 #10
Der går lige et par timer inden jeg er på igen !
Avatar billede keet Nybegynder
12. november 2003 - 15:31 #11
ja, men når jeg klikker på en knap skal cirklen skifte farve, hvordan gøres dette?
Avatar billede _carsten Nybegynder
12. november 2003 - 16:26 #12
private java.awt.Color color = java.awt.Color.GREEN;

// Og i din actionListener som er tilknyttet din knap
// ændrer du farven på din color variabel og kalder paintIcon().
// Nærmere kommer jeg det ikke udfra den kode jeg har set indtil nu.

public void paintIcon(Component c, Graphics g, int x, int y){
        g.setColor(color);

}
Avatar billede _carsten Nybegynder
12. november 2003 - 17:16 #13
Den rigtige/nemme måde at gøre det på er måske at smide en reference med over fra din main klasse til klassen som implementerer Icon, og lave farve justering i knappens actionListener, noget a la nedenstående.

public class MinMain{
    private java.awt.Color color = java.awt.Color.GREEN;

    knap.acctionListener............
    .........
}




public class ClassSomImplIcon implements Icon{
    private MinMain main;

    public ClassSomImplIcon(MinMain main){
        this.main = main;
    }


    public void paintIcon(Component c, Graphics g, int x, int y){
        g.setColor(main.color);

    }
}
Avatar billede keet Nybegynder
13. november 2003 - 17:52 #14
Jeg har følgende 2 klasser:

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

/**
* @author Søren Soltveit
* @version 12-11-03
*/
public class ChangeColor
{
    public Component createComponents()
    {
        //opretter knapper
        JButton buttonRed = new JButton("Rød");
        JButton buttonBlue = new JButton("Blå");
        JButton buttonGreen = new JButton("Grøn");
       
        //opretter label
        final Icon icon = new CircelIcon(20);
        final JLabel label = new JLabel( icon );

        //opretter panel og tilføjer indhold
        JPanel panel = new JPanel();
        panel.setLayout( new GridLayout(0, 3) );
        panel.add( buttonRed );
        panel.add( buttonBlue );
        panel.add( buttonGreen );
        panel.add( label );

        //opretter actionsListeners til knapperne
        buttonRed.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //icon.setColor( Color.RED );
                label.repaint();
            }
        });

        buttonBlue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               
            }
        });
       
        buttonGreen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               
            }
        });

        return panel;
    }
   
    public static void main(String[] args)
    {
        try {
            UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
        }
        catch (Exception e) {
        }

        JFrame frame = new JFrame("Change Color");
        ChangeColor changeColor = new ChangeColor();       
        Component content = changeColor.createComponents();
        frame.getContentPane().add( content );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.show();
    }
}
Avatar billede keet Nybegynder
13. november 2003 - 17:52 #15
og:

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

/**
* @author
* @version 12-11-03
*/
public class CircelIcon implements Icon
{
    private int width;
    private Color color;

    public CircelIcon(int aWidth)
    {
        width = aWidth;
        color = Color.RED;
    }
 
    public int getIconWidth()
    {
        return width;
    }

    public int getIconHeight()
    {
        return width / 2;
    }
   
    public void setColor(Color c)
    {
        color = c;
    }

    public void paintIcon(Component c, Graphics g, int x, int y)
    {
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D.Double ellipse = new Ellipse2D.Double(x,y, width, width);
        g2.setColor( color );
        g2.fill( ellipse );
    }
}
Avatar billede keet Nybegynder
13. november 2003 - 17:53 #16
men jeg kan ikke rigtig tilgå metoden icon.setColor( Color.RED ). Hvordan kan jeg gøre det?
Avatar billede keet Nybegynder
13. november 2003 - 18:10 #17
Kører jeg følgende kode:
Icon ico = (CircelIcon) label.getIcon();
ico.setColor( Color.RED );

Får jeg en fejlmeddelelse: "Cannot resolve symbol - method setColor(....)"
Avatar billede _carsten Nybegynder
13. november 2003 - 20:54 #18
Sorry - var ikke lige opmærksom på at der var aktivitet her inde.

Jeg har markeret med XXXXXX'er hvor jeg har foretaget ændringer, så er de lettere at finde og postet begge dine klasser - nu funker det.

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

/**
* @author Søren Soltveit
* @version 12-11-03
*/
public class ChangeColor
{
    //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    // Definerer en klassevariabel, aktuelle farve
    public java.awt.Color color = java.awt.Color.RED;
   
    public Component createComponents()
    { 
        //opretter knapper
        JButton buttonRed = new JButton("Rød");
        JButton buttonBlue = new JButton("Blå");
        JButton buttonGreen = new JButton("Grøn");
       
        //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        // Tilføjet et argement mere til konstuktøren i din
        // CircelIcon klasse, således at overfører en reference
        // til denne klasse, altså 'this'
        //opretter label
        final Icon icon = new CircelIcon(20, this);
        final JLabel label = new JLabel( icon );
       

        //opretter panel og tilføjer indhold
        JPanel panel = new JPanel();
        panel.setLayout( new GridLayout(0, 3) );
        panel.add( buttonRed );
        panel.add( buttonBlue );
        panel.add( buttonGreen );
        panel.add( label );

        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        // Se knappers actionListeners
        //opretter actionsListeners til knapperne
        buttonRed.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                color = Color.RED;
                label.repaint();
            }
        });

        buttonBlue.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                color = Color.BLUE;
                label.repaint();
            }
        });
       
        buttonGreen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                color = Color.GREEN;
                label.repaint();
            }
        });

        return panel;
    }
   
   
    public static void main(String[] args)
    {
        try {
            UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
        }
        catch (Exception e) {
        }

        JFrame frame = new JFrame("Change Color");
        ChangeColor changeColor = new ChangeColor();       
        Component content = changeColor.createComponents();
        frame.getContentPane().add( content );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.show();
    }
}







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

/**
* @author
* @version 12-11-03
*/
public class CircelIcon implements Icon
{
    private int width;
    private Color color;
    // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    // Reference til main klasse
    private ChangeColor chColor;

    // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    // Tilføjet et argument til klassen som kalder denne klasse
    public CircelIcon(int aWidth, ChangeColor chColor)
    {
        this.chColor = chColor;
        width = aWidth;
        color = Color.RED;
    }
 
    public int getIconWidth()
    {
        return width;
    }

    public int getIconHeight()
    {
        return width / 2;
    }
   
    public void setColor(Color c)
    {
        color = c;
    }

    public void paintIcon(Component c, Graphics g, int x, int y)
    {
        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        // Henter aktuelle farve din main klasse/parent
        color = chColor.color;
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D.Double ellipse = new Ellipse2D.Double(x,y, width, width);
        g2.setColor( color );
        g2.fill( ellipse );
    }
}
Avatar billede keet Nybegynder
14. november 2003 - 17:57 #19
Jeg fandt selv en lidt simplere løsning. Problemet var følgende kode "final Icon icon = new CircelIcon( 20 );"
Men det skulle istedet være "final CircelIcon icon = new CircelIcon( 20 );"
Metoden setColor findes jo ikke i "Icon"

Men ellers tak for indsatsen, så du får pointne :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester