Avatar billede tl Nybegynder
16. januar 2004 - 11:32 Der er 10 kommentarer

Grafik i Java og Swing

Hvordan blander man Grafik og Swing componenter i Java.

Graphics objektet er jo ikke en component, man kan tilføje til et Panel eller Pane, så hvordan går man det hvis man gerne vil have et panel med grafik og et med Swing componenter i samme frame?
Avatar billede repsak Nybegynder
16. januar 2004 - 11:42 #1
ethvert swing komponent har en graphics, som du kan tegne på. Hvad er det mere præcist du vil?
Avatar billede tl Nybegynder
16. januar 2004 - 11:44 #2
ok.. så jeg kan tage et JPanel og tegne grafik direkte derpå?
Avatar billede _carsten Nybegynder
16. januar 2004 - 12:17 #3
Ja - det kan du, prøv nedenstående eksempel, tegner streger med musen

public class JFrame extends javax.swing.JFrame {
   
    public JFrame() {
        initComponents();
    }

    private void initComponents() {
        panel = new javax.swing.JPanel();

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

        panel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tegn(evt);
            }
        });
        panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                drag(evt);
            }
        });

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

        pack();
    }

    private void drag(java.awt.event.MouseEvent evt) {
        int q = evt.getX();
        int w = evt.getY();
        g2.drawLine(x , y, q, w);

    }

    private void tegn(java.awt.event.MouseEvent evt) {
        g = panel.getGraphics();
        g2 = (java.awt.Graphics2D)g;
        x = evt.getX();
        y = evt.getY();
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame().show();
    }
     
    private javax.swing.JPanel panel;
    private java.awt.Graphics g;
    private java.awt.Graphics2D g2;
    private int x, y;
}
Avatar billede tl Nybegynder
16. januar 2004 - 12:55 #4
Ok tak...

Jeg har lavet en modification - som nu ikke virker.. man skulle kunne tegne en kasse man kan flytte rundt med.

kan du gennemskue hvorfor.


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

public class JFrame extends javax.swing.JFrame {
   
    Rectangle rect;
   
    public JFrame() {
        initComponents();
    }

    private void initComponents() {
        panel = new javax.swing.JPanel();
       
 

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

        panel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tegn(evt);
            }
        });
        panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                drag(evt);
            }
        });
        getContentPane().add(panel, java.awt.BorderLayout.CENTER);
        setSize(300,300);
       
       
        g = panel.getGraphics();
        g2 = (java.awt.Graphics2D)g;
        rect = new Rectangle(10,10,10,10);
        g2.draw(rect);
        show();
    }

    private void drag(java.awt.event.MouseEvent evt) {
        int q = evt.getX();
        int w = evt.getY();
      //  g2.drawLine(x , y, q, w);

    }

    private void tegn(java.awt.event.MouseEvent evt) {
        rect.setLocation(x,y);   
        repaint();
        }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame().show();
    }
     
    private javax.swing.JPanel panel;
    private java.awt.Graphics g;
    private java.awt.Graphics2D g2;
    private int x, y;
}
Avatar billede _carsten Nybegynder
16. januar 2004 - 13:07 #5
Vender tilbage senere - pt. ikke tid
Avatar billede tl Nybegynder
16. januar 2004 - 13:10 #6
helt ok...
Avatar billede tl Nybegynder
16. januar 2004 - 14:35 #7
seneste udgave-- kan compile, men virker mærkeligt nok stadig ikke.


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

public class JFrame extends javax.swing.JFrame {
   
    public Rectangle rect;
   
    public JFrame() {
        initComponents();
    }

    private void initComponents() {
        panel = new javax.swing.JPanel();
       
 

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

        panel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tegn(evt);
            }
        });
        panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                drag(evt);
            }
        });
        getContentPane().add(panel, java.awt.BorderLayout.CENTER);
        setSize(300,300);
          show();
       
       
        g = panel.getGraphics();
        g2 = (java.awt.Graphics2D)g;
        rect = new Rectangle(100,100,100,100);
        g2.draw(rect);
        repaint(); 
        show();
    }

    private void drag(java.awt.event.MouseEvent evt) {
        int q = evt.getX();
        int w = evt.getY();
      //  g2.drawLine(x , y, q, w);

    }

    private void tegn(java.awt.event.MouseEvent evt) {
        rect.setLocation(x,y);   
        repaint();
        }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame().show();
    }
     
    private javax.swing.JPanel panel;
    private java.awt.Graphics g;
    private java.awt.Graphics2D g2;
    private int x, y;
}
Avatar billede _carsten Nybegynder
16. januar 2004 - 16:01 #8
Sådan skal den se ud for at virke.
Kigger forbi senere på dagen/aftenen hvis du har spørgsmål.

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

public class JFrame extends javax.swing.JFrame {
   
    private Rectangle rect;
   
    public JFrame() {
        initComponents();
        g = this.getGraphics();
        g2 = (java.awt.Graphics2D)panel.getGraphics();
        rect = new Rectangle(25,25,25,25);
        g2.draw(rect);
    }

    private void initComponents() {
        panel = new javax.swing.JPanel();
       
 

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

        panel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tegn(evt);
            }
        });
        panel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                tegn(evt);
            }
        });
        panel.setBackground(java.awt.Color.WHITE);
        getContentPane().add(panel, java.awt.BorderLayout.CENTER);
        setSize(300,300);

        show();
    }

    private void tegn(java.awt.event.MouseEvent evt) {
        super.paintComponents(g);
        rect.setLocation(evt.getX(), evt.getY());
        g2.draw(rect);
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }

    public static void main(String args[]) {
        new JFrame();
    }
     
    private javax.swing.JPanel panel;
    private java.awt.Graphics g;
    private java.awt.Graphics2D g2;
    private int x, y;
}
Avatar billede _carsten Nybegynder
16. januar 2004 - 18:32 #9
Fik lige tid til at kaste lidt kommentarer

        // Det er vigtigt at du kalder show() inden du initierer dit
        // graphics object, ellers får du sikkert en nullpointerException
        show();

        g = panel.getGraphics();
        g2 = (java.awt.Graphics2D)g;
        rect = new Rectangle(100,100,100,100);
        g2.draw(rect);
        repaint(); 

   
    private void tegn(java.awt.event.MouseEvent evt) {
        // Det er ligeledes vigtigt at får gentegnet din Frame før
        // dit rektangel
        super.paintComponents(g);
        rect.setLocation(evt.getX(), evt.getY());
        g2.draw(rect);
    }
Avatar billede peterdelphi Nybegynder
12. februar 2005 - 16:01 #10
Alle SWING komponenter nedarver fra JComponent og alle JComponents har en paint metode...

public class myPanel extends JPanel {
  public void paint(Graphics g) {
    g.setColor(Color.WHITE);
    g.drawLine(0, 0, this.getWidth(), this.getHeight());
    // osv...

    /*
      hvis du vil kalde paint metoden på super klassen:
      super.paint(g);

      dette objekt har flere advanceret metoder:
      Graphics2D g2 = (Graphics2D)g;
      g2.setColor(Color.WHITE);
      g2.drawLine(0, 0, this.getWidth(), this.getHeight());     
    */
  }
}

JPanel b_panel = new JPanel();
b_panel.add(new MyPanel());
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