Question

I ont un ensemble de JLabels, contenant chacun une lettre (via setext ()), chaîne opaque et le fond de blanc, sur un JPanel avec un GridLayout de sorte que les étiquettes forment une table. Je fais une animation simple de mettre en évidence certaines lignes et colonnes puis il y a intersection. Je peux utiliser le setBackground() d'étiquettes à cette fin, mais pensé que j'aurais plus « choix » si un était en mesure d'utiliser un objet Graphics (dessin peut-être un cercle autour de l'intersection, puis l'effacer). J'ai essayé d'étendre JLabel, ou le dessin sur le JPanel directement (en utilisant getGraphics() dans une méthode), mais ça n'a pas marché, je pense que le dessin est derrière les étiquettes dans ce cas. Je ne peux pas savoir où si la « peinture » code soit placé dans les deux cas, rien ne semblait à l'écran.

bref, une méthode comme suit, peut être utilisé pour dessiner sur des étiquettes?
devrait-il être un JLabel ou une méthode JPanel?

public void drawsomething() {
    Graphics2D g2d = (Graphics2D) getGraphics();
    g2d.fillRect(100, 100, 100, 100);
    }
Était-ce utile?

La solution

Que faire si vous substituez paintChildren()?

protected void paintChildren(Graphics g) {
  super.paintChildren(g);
//paint your lines here
}

Autres conseils

Vous pouvez essayer un JLayeredPane pour peindre vos dessins spécifiques au-dessus des JComponents existants

voir par exemple ici http://docs.oracle.com/javase /tutorial/uiswing/components/layeredpane.html

Je ne sais vraiment pas grand-chose sur le dessin des choses encore, mais vient de créer un code de petit échantillon pour vous de regarder, nous espérons que vous pouvez obtenir des informations sur lui. Afin de peindre sur la méthode JLabel you can use it's paintComponent(Graphics g).

Exemple de code:

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

public class DrawingOnJLabel extends JFrame
{
    private CustomLabel label;
    private int flag = 1;
    private JPanel contentPane;

    public DrawingOnJLabel()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        contentPane = new JPanel();
        contentPane.setBackground(Color.WHITE);
        label = new CustomLabel(200, 200);
        label.setLabelText("A");
        label.setValues(50, 50, 100, 100, 240, 60);

        final JButton button = new JButton("CLEAR");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        if (flag == 1)              
                        {
                            label.setFlag(flag);
                            flag = 0;
                            button.setText("REPAINT");
                            contentPane.revalidate();
                            contentPane.repaint();
                        }   
                        else if (flag == 0) 
                        {
                            label.setFlag(flag);
                            flag = 1;
                            button.setText("CLEAR");
                            contentPane.revalidate();
                            contentPane.repaint();
                        }
                    }
                });
            }
        });     

        contentPane.add(label);

        add(contentPane, BorderLayout.CENTER);
        add(button, BorderLayout.PAGE_END);
        setSize(300, 300);
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new DrawingOnJLabel();
            }
        });
    }
}

class CustomLabel extends JLabel
{
    private int sizeX;
    private int sizeY;
    private int x, y, width, height, startAngle, arcAngle;
    private int flag = 0;
    private String text;

    public CustomLabel(int sX, int sY)
    {
        sizeX = sX;
        sizeY = sY; 
    }

    // Simply call this or any set method to paint on JLabel.
    public void setValues(int x, int y, int width, int height, int startAngle, int arcAngle)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.startAngle = startAngle;
        this.arcAngle = arcAngle;
        repaint();
    }

    public void setFlag(int value)
    {
        flag = value;
        repaint();
    }

    public Dimension getPreferredSize()
    {
        return (new Dimension(sizeX, sizeY));
    }

    public void setLabelText(String text)
    {
        super.setText(text);
        this.text = text;
        flag = 0;
        repaint();
    }

    public void paintComponent(Graphics g)
    {
        if (flag == 0)
        {
            g.setColor(Color.RED);          
            g.drawString(text, 20, 20);
            g.setColor(Color.BLUE);
            g.drawOval(x, y, width, height);
            g.fillOval(x + 20, y + 20, 15, 15);
            g.fillOval(x + 65, y + 20, 15, 15);
            g.fillRect(x + 40, y + 40, 5, 20);
            g.drawArc(x + 20, y + 30, 55, 55, startAngle, arcAngle);            
        }
        else if (flag == 1)
        {
            g.clearRect(x, y, width, height);
        }
    }
}

Utilisation paintComponent (Graphics g) au lieu de la peinture (Graphics g). Cela peinture sur l'interface graphique

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top