Avatar billede mickni33 Nybegynder
30. marts 2005 - 16:27 Der er 9 kommentarer og
1 løsning

Graphics på mit panel i awt

hvordan for jeg min graphics til at tegne på et panel og ikke min Frame
Avatar billede _carsten Nybegynder
30. marts 2005 - 16:31 #1
Graphics g = mitPanel.getGraphics()
Avatar billede arne_v Ekspert
30. marts 2005 - 16:41 #2
Er det ikke omvendt - man lader paint for den rigtige komponent tegne
på sin graphics ?
Avatar billede _carsten Nybegynder
30. marts 2005 - 17:03 #3
Jeg havede nær sagt at det er næsten hip som hap, afhænger selvfølgelig af hvor meget der skal tegnes på panelet

Men det gør jo koden klart mere gennemskuelig at lave en klasse som extender JPanel og lade den klasse gøre tegnearbejdet, men er det bare nogle images der skal tegnes på et panel, ville jeg nok gøre det på den anden måde.
Avatar billede mickni33 Nybegynder
31. marts 2005 - 13:14 #4
dvs at man lader ikke sin GUI lave alt GUI
Avatar billede _carsten Nybegynder
31. marts 2005 - 14:36 #5
Jo - skal prøve om jeg kan nå at lave et eksempel i aften
Avatar billede mickni33 Nybegynder
31. marts 2005 - 15:12 #6
ej det kunne være fedt hvis du gad det... er god til java meeen detder GUI er jeg ikke så stærk i
Avatar billede _carsten Nybegynder
31. marts 2005 - 17:28 #7
Nåede lige at lave et eksempel (eller 3) med lidt kommentarer til

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class Test3 extends javax.swing.JFrame {
    public Test3() {
        initComponents();
        setSize(600,250);
    }
   
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        panel_2 = new javax.swing.JPanel();
        panel_1 = new Panel_1();
        panel_3 = new Panel_3();

        getContentPane().setLayout(new java.awt.GridLayout(1, 3));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("Tegn gul cirkel p\u00e5 panel 2");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tegn(evt);
            }
        });

        getContentPane().add(jButton1);
        getContentPane().add(panel_1);
        getContentPane().add(panel_2);
        getContentPane().add(panel_3);

        pack();
    }

    /* Tegner en gul cirkel på panelet, cirklen forsvinder
    * hvis du resizer framen, bruger getGraphics()
    */
    private void tegn(java.awt.event.ActionEvent evt) {
        Graphics gp = panel_2.getGraphics();
        gp.setColor(Color.YELLOW);
        gp.fillOval(0, 0, panel_2.getWidth(),  panel_2.getHeight());
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test3().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JPanel panel_2;
    private Panel_1 panel_1;
    private Panel_3 panel_3;
}


/* Klassen hvor den røde cirkel tegnes, ved at
* override paintComponent, hvis du resizer framen
* vil cirklen altid blive tegnet, i modsætning til
* panelet med den gule cirkel der forsvinder
* når framen resizes
*/

class Panel_1 extends JPanel{
    public Panel_1(){
        super();
    }
   
    public void paintComponent(Graphics g){
        super.paintComponent(g);
       
        g.setColor(Color.RED);
        g.fillOval(0, 0, getWidth(),  getHeight());
    }
}



/*
* I denne klassen kan du tegne prikker ved at klikke
* med musen, disse fjernes heller ikke ved resize, da
* der tegnes på et BufferedImage som igen tegnes på panelet
*/
class Panel_3 extends JPanel{
    public Panel_3(){
        super();
        setBackground(Color.WHITE);
       
        addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent evt){
                  tegn(evt);
                }
        });

    }
   
    private void tegn(MouseEvent evt){
        g2.drawLine(evt.getX(), evt.getY(), evt.getX(), evt.getY());
        repaint();
    }
   
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        if(offscreen == null){
            offscreen = (BufferedImage)createImage(this.getWidth(), this.getHeight());
            g2 = (Graphics2D)offscreen.getGraphics();
            g2.setColor(new java.awt.Color(255,255,255));
            g2.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.drawImage(offscreen, 0, 0, this);
            g2.setColor(new java.awt.Color(0,0,0));
        }
        else
            g.drawImage(offscreen, 0, 0, this);
    }
   
    private BufferedImage offscreen;
    private Graphics2D g2;
}
Avatar billede mickni33 Nybegynder
31. marts 2005 - 18:28 #8
Hvis man skal lave et program som tegner en masse forskellige ting så vil der jo være flere små klasser...

Så holder man sig vel til en hovedFrame som så tilgår de andre klasser som skal tegne forskellige ting....

Skal man så sende sine GUI objekter så som Panel eller Textbox med over i en Firkant klasse hvor der så tegnes ?

Du kan vist godt lige lave et svar samtidigt
Avatar billede _carsten Nybegynder
31. marts 2005 - 22:28 #9
Tjaaaa - noget i den retning, den klasse som laver tegnearbejdet, skal have en reference til værktøjet og så skal du lade paintComponent gøre tegnearbejdet, det skulle nedenstående eksempel gerne illustrere.



import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

public class Test2 extends javax.swing.JFrame {
   
    public Test2() {
        drawfig = new DrawFigure();
        initComponents();
        setSize(500,500);
    }

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        combobox = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jPanel1.setBorder(new javax.swing.border.EtchedBorder());
        jPanel1.setMinimumSize(new java.awt.Dimension(0, 0));
        jLabel1.setText("V\u00e6lg tegneredskab");
        jPanel1.add(jLabel1);

        combobox.setMaximumRowCount(3);
        combobox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0", "1", "2" }));
        combobox.setMinimumSize(new java.awt.Dimension(45, 25));
        combobox.setPreferredSize(new java.awt.Dimension(45, 25));
        combobox.setRenderer(new DrawFigure());
        jPanel1.add(combobox);

        getContentPane().add(new Panel_3(combobox), java.awt.BorderLayout.CENTER);
        getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);

        pack();
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Test2().setVisible(true);
            }
        });
    }
   
    private javax.swing.JComboBox combobox;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private DrawFigure drawfig;
}



class DrawFigure extends JComponent implements ListCellRenderer{
    private int i;
    private Color color;
   
    public DrawFigure(){
    }
   
    public void paintComponent(Graphics g){
        int h = 22;
        g.setColor( color );
        g.fillRect(0,0, getWidth(), h);
       
        g.setColor(Color.BLACK);
        switch(i){
            case 0 : g.drawLine(2, 2, h-4, h-4); break;
            case 1 : g.drawOval(2, 2, h-4, h-4); break;
            case 2 : g.drawRect(2, 2, h-4, h-4); break;
        }
    }

    public Dimension getPreferredSize(){
        return new Dimension(38, 22);
    }
   
    public Component getListCellRendererComponent(JList list,
                                                    Object value,
                                                    int index,
                                                    boolean isSelected,
                                                    boolean cellHasFocus) {
       
       
        this.i = (value != null ? new Integer(value.toString()) : 0);
       
        if (isSelected)
            color = list.getSelectionBackground();
        else
            color = list.getBackground();
           
        return this;
    }
}



class Panel_3 extends JPanel{
    private JComboBox cmb;
    public Panel_3(JComboBox cmb){
        super();
        setBackground(Color.WHITE);
        this.cmb = cmb;
       
        addMouseListener(new MouseAdapter(){
                public void mousePressed(MouseEvent evt){
                  tegn(evt);
                }
        });

    }
   
    private void tegn(MouseEvent evt){
        g2.setColor(Color.BLACK);
        int h = cmb.getHeight();
        int i = new Integer(cmb.getSelectedItem().toString()).intValue();
       
        switch(i){
            case 0 : g2.drawLine(evt.getX(), evt.getY(), evt.getX() + h, evt.getY() + h); break;
            case 1 : g2.drawOval(evt.getX(), evt.getY(), h-4, h-4); break;
            case 2 : g2.drawRect(evt.getX(), evt.getY(), h-4, h-4); break;
        }
        repaint();
    }
   
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        if(offscreen == null){
            offscreen = (BufferedImage)createImage(this.getWidth(), this.getHeight());
            g2 = (Graphics2D)offscreen.getGraphics();
            g2.setColor(new java.awt.Color(255,255,255));
            g2.fillRect(0, 0, this.getWidth(), this.getHeight());
            g.drawImage(offscreen, 0, 0, this);
            g2.setColor(new java.awt.Color(0,0,0));
        }
        else
            g.drawImage(offscreen, 0, 0, this);
    }
   
    private BufferedImage offscreen;
    private Graphics2D g2;
}
Avatar billede mickni33 Nybegynder
01. april 2005 - 08:42 #10
Du har fortjent dine point :-)
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