Frage

Ich habe einen Satz von JLabels, jeweils einen Buchstaben (über setext ()), undurchsichtig und Hintergrund auf weiß eingestellt, auf a JPanel mit einer GridLayout Die Etiketten bilden also einen Tisch. Ich mache eine einfache Animation, um bestimmte Zeilen und Spalten hervorzuheben und dann die Kreuzung. Ich kann das verwenden setBackground() von Etiketten für diesen Zweck, aber ich dachte, ich hätte mehr "Entscheidungen", wenn a in der Lage wäre, a Graphics Objekt (vielleicht einen Kreis um die Kreuzung zeichnen und dann klären). Ich habe versucht zu verlängern JLabel, oder zeichnen auf der JPanel Direkt (Verwendung getGraphics() in einer Methode), aber es hat nicht funktioniert, ich denke, die Zeichnung befindet sich in diesem Fall hinter den Etiketten. Ich kann nicht herausfinden, wo der Code "Malerei" in beiden Fällen platziert werden soll, nichts erschien auf dem Bildschirm.

Kurz gesagt, eine Methode wie Folgendes kann verwendet werden, um über Etiketten zu zeichnen?
Sollte es eine JLABEL- oder eine JPanel -Methode sein?

public void drawsomething() {
    Graphics2D g2d = (Graphics2D) getGraphics();
    g2d.fillRect(100, 100, 100, 100);
    }
War es hilfreich?

Lösung

Was ist, wenn Sie überschreiben? paintChildren() ?

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

Andere Tipps

Vielleicht möchten Sie eine JLayeredPane ausprobieren, um Ihre spezifischen Zeichnungen über die vorhandenen jcomponents zu malen

Siehe Beispiel hier http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

Ich weiß noch nicht viel über das Zeichnen von Sachen, aber nur einen kleinen Beispielcode für Sie, den Sie ansehen können, hoffentlich können Sie einige Informationen daraus machen. Um auf das zu malen JLabel you can use it's paintComponent(Graphics g) Methode.

Ein Beispielcode:

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

Verwenden Sie PaintComponent (Grafik G) anstelle von Paint (Grafik G). Das wird die GUI übertragen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top