Algumas dúvidas quanto ao desenho de linhas

4 respostas
G

Olá galera, estou precisando fazer o desenho de linhas neste meu projeto, mas estou tendo algumas dificuldades:

1 - Desenho uma linha na tela, mas quando alguma coisa (como outro janela) passa por cima dela, a linha desaparece. Para tentar solucionar, coloquei um repaint() a cada 10ms, mas dessa forma a linha fica piscando sem parar. O que eu poderia fazer?

2 - Como eu poderia definir a largura de uma linha?

Segue o meu código:

public class Frame extends JFrame {
  
  boolean m_lacoPrincipal = true;
  
  Frame () {
    setTitle("Teste");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(1024,768);
    setLocationRelativeTo(null);
    setResizable(false);
    setLayout(null);
    
    setVisible(true);
    repaint();
    
    while (m_lacoPrincipal) {
      repaint();
      try { Thread.sleep(10); } catch (Exception excecao) {}
    }
  }

  @Override
  public void paint(Graphics g) {
    super.paint(g);
    g.setColor(new Color(0,255,0));
    g.drawLine(100, 100, 500, 500);
  }

}

Agradeço desde já qualquer ajuda.

4 Respostas

E
package guj;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

// Nunca sobreponha diretamente o método "paint" do JFrame
class LinhaPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create(); // nunca trabalhe diretamente sobre g, apenas sobre uma cópia de g
        g2d.setColor(Color.GREEN);  
        g2d.drawLine(100, 100, 500, 500);         
        g2d.dispose(); // toda vez que você usa "create" é necessário usar "dispose"
    }
}

public class ExemploDesenhoLinha extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel pnlLinha = null;

    private JPanel getPnlLinha() {
        if (pnlLinha == null) {
            pnlLinha = new LinhaPanel();
            pnlLinha.setLayout(new BorderLayout());
        }
        return pnlLinha;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploDesenhoLinha thisClass = new ExemploDesenhoLinha();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public ExemploDesenhoLinha() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(600, 600);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo de Desenho de uma Linha");
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getPnlLinha(), BorderLayout.CENTER);
        }
        return jContentPane;
    }
}
E

A propósito, usar “m_” para indicar variáveis-membro em uma classe só é costumeiro em C++ (em Java não é costume usar isso).

É mais ou menos como você dizer “lograr” - é uma palavra válida em português, mas normalmente você a usa para dizer “enganar”, não “conseguir”, embora no dicionário também esteja como “conseguir” ou “alcançar”.
Em espanhol, essa palavra “lograr” quer dizer só “conseguir”.
Em português, “Fui logrado” == “fui enganado”
Em espanhol, “Logró llegar a director” = “conseguiu chegar a diretor”.

G

Obrigado entanglement, agora só me resta saber como aumentar a largura de uma linha. =)

Agradeço qualquer ajuda.

E

Você precisa ver o Java Tutorial sobre Java2D:

http://download.oracle.com/javase/tutorial/2d/index.html

No seu caso, vou dar um brinde.

@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create(); // nunca trabalhe diretamente sobre g, apenas sobre uma cópia de g
        g2d.setColor(Color.GREEN);
        // Desenhando uma linha grossa e tracejada, com as extremidades redondas
        float[] dash = {30f};
        g2d.setStroke(new BasicStroke (10f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, dash, 0f));
        g2d.drawLine(100, 100, 500, 500);         
        g2d.dispose(); // toda vez que você usa "create" é necessário usar "dispose"
    }
Criado 21 de setembro de 2011
Ultima resposta 22 de set. de 2011
Respostas 4
Participantes 2