Avatar billede Slettet bruger
13. april 2008 - 13:00 Der er 12 kommentarer

Java grafik problem

Jeg har et problem med at Java på PC tilsyneladende opfører sig anderledes end Java på Mac.

Har for nylig lavet et lille Etc-a-sketch tegneprogram. Det kører perfekt på min Mac, men når jeg downloader det og kører på en PC er der alle mulige grafik problemer, f.eks. at baggrundsbilledet bliver fjernet når jeg vælger et menupunkt, samt at hvis jeg vælger "clear" oppe i menu'en...kommer der en dobbelt menu! Også hvis jeg navigerer væk fra programmet, og så vender tilbage igen, så er ser vinduet anderledes ud.

Hvordan kan det være at der er forskel på Mac og PC? jeg troede at hele point'en med Java var at det var platformsuafhængigt.

Prøv selv at checke mit program ud:

http://sidestuff.dk/files/Etch-a-sketch_v1.3.jar
Avatar billede _carsten Nybegynder
13. april 2008 - 20:09 #1
1. du skal ikke adde din menubar til headPanel, men derimod adde den til JFrame

          Sådan skal det gøres:      setJMenubar(menuBar);
  Det betyder samtidig at du fjerne denne linie:  containerPanel.add("North", headPanel);
- en applikations menu ligger i applikationen og ikke i en eller anden subcontainer

2. Hvorfor kalder du super() i din actionListener
            {
                super();
            }

    Totalt grundløst !
    Man kalder kun superklassens constructor i den første linie i subklassens constructor

Og så forstår jeg ikke din brug af LayeredPane, men det skyldes måske at jeg aldrig har sat mig ind i det, virker bare ikke logisk som du gør det.
Avatar billede Slettet bruger
13. april 2008 - 21:37 #2
Carsten, tak for dine tips. Super. Det vil jeg lige undersøge. Jeg er stadig newbie, så det er ikke usandsynligt at koden kan optimeres lidt.
Hvordan er det iøvrigt lykkedes dig at læse min kildekode? :)
Avatar billede riversen Nybegynder
13. april 2008 - 21:46 #3
java kode kan nemt dekompileres uden videre vha. en dekompiler
Avatar billede _carsten Nybegynder
13. april 2008 - 22:04 #4
Jeg brugte "Cavaj Decompiler" :)
Avatar billede Slettet bruger
13. april 2008 - 22:40 #5
Nu har jeg lagt menuBar på selve framen, så den del af det er fint.

Men din kommentar ang. "super();" forstår jeg ikke; dette kald foretager jeg mig ikke nogen steder i koden, heller ikke i mine actionlisteners.
Tilføjelse: nu har jeg også prøvet at decompile min jar-fil med Cavaj, og ja, i den kildekode man får tilbage optræder "super();" flere gange. Men det gør den altså ikke i min originale Java kode.

Har lagt den nye jar op som v1.4 (på sidestuff.dk), og som det (sandsynligvis) vil fremgå, så har jeg - på trods af den nye menu - stadig problemet med dobbeltmenu'er osv. som beskrevet tidligere. Rimelig frustrerende....
Avatar billede _carsten Nybegynder
14. april 2008 - 10:13 #6
Du tilføjer menuen 2 gange, både i Application1 of Frame1.

Reelt set har du ikke noget at bruge Application1 til, flyt din main() metode over i Frame1 og kopier de få variabler der er nødvendige over i Frame1 og slet Application1

Alternativt - slet disse linier i Application1:

        mBar = frame.getMBar();
        frame.setJMenuBar(mBar);
Avatar billede Slettet bruger
14. april 2008 - 12:02 #7
Er ret sikker på at jeg ikke tilføjer menu'en 2 gange. Der har været en version hvor den har stået i begge klasser, men så har den ene været kommenteret ud. Dobbeltmenu'en kommer jo også kun når jeg benytter mig af clear-funktionen oppe under menupunktet "File". Ellers er den der ikke. :)
Avatar billede _carsten Nybegynder
14. april 2008 - 12:44 #8
Hvis du nu copy/paster kildekoden her, så vi er fri for at decompile, og så tror jeg vi hurtigere når en løsning.
Avatar billede Slettet bruger
14. april 2008 - 21:47 #9
package tegneprogram;

import java.awt.Dimension;
import java.awt.Toolkit;


import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.UIManager;

public class Application1 {
    JMenuBar mBar = new JMenuBar();


    public Application1() {

        int bredde = 800, hoejde = 600;

        Frame1 frame = new Frame1(bredde, hoejde);
        frame.setResizable(false);


        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();


        mBar = frame.getMBar();

        frame.setJMenuBar(mBar);

        ///////////////////////////////


        frame.pack();
        Dimension frameSize = frame.getSize();
        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        frame.setLocation((screenSize.width - frameSize.width) / 2,
                          (screenSize.height - frameSize.height) / 2);


        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        frame.setVisible(true);


    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        new Application1();

    }
}






package tegneprogram;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.*;


public class Frame1 extends JFrame {
    private int bredde, hoejde, tegningHoejde;


    private Tegning tegning;

    private JPanel headPanel = new JPanel();

    private JPanel containerPanel;

    private String saveFile;

    private JMenuBar menuBar = new JMenuBar();
    private JMenu menuFile = new JMenu();
    private JMenuItem menuFileExit = new JMenuItem();
    private JMenuItem menuFileClear = new JMenuItem();
    private JMenuItem menuFileSaveAs = new JMenuItem();
    private JMenu menuHelp = new JMenu();
    private JMenuItem menuHelpAbout = new JMenuItem();
    private JMenuItem menuHelpHelp = new JMenuItem();
    private JLayeredPane layerPane;

    Graphics2D grafik;

    private Dimension d;


    private JFileChooser fc = new JFileChooser();
    Baggrund baggrund;


    public Frame1(int bredde, int hoejde) {
        this.hoejde = hoejde;
        this.bredde = bredde;

        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void jbInit() throws Exception {


        this.setTitle("Etch-a-sketch");


        // MENUBAR //


        menuFileExit.setText("Quit Etch-a-sketch");
        menuFileExit.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileExit_ActionPerformed(ae);
                    }
                });

        menuFileClear.setText("Clear");
        menuFileClear.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileClear_ActionPerformed(ae);
                        //kanvas.requestFocus();
                    }
                });

        menuFileSaveAs.setText("Save As...");
        menuFileSaveAs.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileSaveAs_ActionPerformed(ae);
                        //kanvas.requestFocus();
                    }
                });

        menuFile.add(menuFileClear);
        menuFile.add(menuFileSaveAs);
        menuFile.add(menuFileExit);

        menuFile.setText("File");

        menuBar.add(menuFile);

        menuHelpHelp.setText("Etch-a-sketch Help");
        menuHelpHelp.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {

                        helpHelp_ActionPerformed(ae);

                    }
                });

        menuHelpAbout.setText("About");
        menuHelpAbout.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {

                        helpAbout_ActionPerformed(ae);

                    }
                });
        menuHelp.add(menuHelpHelp);
        menuHelp.add(menuHelpAbout);
        menuHelp.setText("Help");

        menuBar.add(menuHelp);

        ///////////////////////////////////////////////////////


        // LAYOUT

        headPanel.setLayout(new BorderLayout());

        containerPanel = new JPanel();
        containerPanel.setLayout(new BorderLayout());
        containerPanel.setPreferredSize(new Dimension(bredde, hoejde));


        d = headPanel.getPreferredSize();

        tegningHoejde = hoejde - d.height;

        tegning = new Tegning(bredde, tegningHoejde);

        baggrund = new Baggrund();
        layerPane = new JLayeredPane();
        layerPane.setLayout(null);

        layerPane.add(baggrund, 1);
        baggrund.setBounds(0, 0, bredde, tegningHoejde);
        layerPane.add(tegning, 0);
        tegning.setBounds(0, 0, bredde, tegningHoejde);

        containerPanel.add("Center", tegning);

        containerPanel.setOpaque(false);

        this.setContentPane(containerPanel);

    }


    void fileExit_ActionPerformed(ActionEvent e) {
        System.exit(0);
    }

    void fileClear_ActionPerformed(ActionEvent x) {


        tegning.clearKanvas();

        tegning.resetCord();

        //baggrund.redrawBG();

    }

    void fileSaveAs_ActionPerformed(ActionEvent x) {

        File theFile = new File("Drawing.png");
        saveFile = "yes";

        do {

            fc.setSelectedFile(theFile); //sets the file name field to "testfile.txt"
            int returnVal = fc.showSaveDialog(this);


            if (returnVal == JFileChooser.APPROVE_OPTION) {


                try {


                    theFile = fc.getSelectedFile();


                    if (theFile.exists()) {
                        int result =
                            JOptionPane.showConfirmDialog(this, "The selected file already exists. " +
                                                          "Do you want to overwrite it?",
                                                          "The file already exists",
                                                          JOptionPane.YES_NO_CANCEL_OPTION,
                                                          JOptionPane.QUESTION_MESSAGE);
                        switch (result) {
                        case JOptionPane.YES_OPTION:
                            saveFile = "yes";
                            break;
                        case JOptionPane.NO_OPTION:
                            saveFile = "no";
                            break;
                        case JOptionPane.CANCEL_OPTION:
                            saveFile = "cancel";
                            break;
                        }
                    }


                    if (saveFile == "yes") {
                        BufferedImage image =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        Graphics2D g2d = image.createGraphics();


                        BufferedImage baggrunden =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        baggrunden = baggrund.getBaggrund();

                        BufferedImage tegningen =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        tegningen = tegning.getDrawing();

                        g2d.drawImage(baggrunden, 0, 0,
                                      this); // Paint baggrund pŒ image!
                        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                                                    1f));
                        g2d.drawImage(tegningen, 0, 0, this);

                        ImageIO.write(image, "png", theFile);
                        g2d.dispose();
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            } else {
                saveFile = "cancel";
                System.out.println("xxx");
            }

        } while

        (saveFile == "no");


    }

    void buttonOpen_ActionPerformed(ActionEvent e) {
        System.out.println("Open!");
    }


    void helpHelp_ActionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, new Frame1_HelpBoxPanel1(),
                                      "Etch-a-sketch Help",
                                      JOptionPane.PLAIN_MESSAGE);

    }

    void helpAbout_ActionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, new Frame1_AboutBoxPanel1(),
                                      "About", JOptionPane.PLAIN_MESSAGE);

    }

    public JMenuBar getMBar() {
        return menuBar;
    }


}







package tegneprogram;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

import java.io.File;

import java.net.URL;

import javax.imageio.ImageIO;

import javax.swing.*;

public class Tegning extends JPanel implements Runnable, KeyListener {

    ImageIcon icon;
    boolean firstRun, redrawBG, kanvasRenset;
    private int posX, posY, bredde, hoejde;
    private boolean up, down, left, right, clearKanvas, shift;
    Graphics2D kanvasKopi, gr;
    JPanel panelKopi;
    Image image;
    int counter, hastighed;
    Timer timer;

    BufferedImage bi;
    private JFileChooser fc = new JFileChooser();


    public Tegning(int bredde, int hoejde) {

        bi = new BufferedImage(bredde, hoejde, BufferedImage.TYPE_INT_ARGB);
        kanvasKopi = bi.createGraphics();

        hastighed = 20;
        setFocusable(true);
        this.addKeyListener(this);

        this.bredde = bredde;
        this.hoejde = hoejde;
        resetCord();

        Thread t = new Thread(this);
        t.start();
    }

    public void run() {
        while (true) {


            if (left && posX > 0 + 1)
                posX--;
            if (right && posX < this.getWidth() - 1)
                posX++;
            if (up && posY > 0 + 1)
                posY--;
            if (down && posY < this.getHeight() - 1)
                posY++;

            repaint();

            // Vent lidt
            try {
                Thread.sleep(hastighed);
            } catch (Exception e) {
                System.out.println();
            }
            ;
        }


    }


    /** Returns an ImageIcon, or null if the path was invalid. */
    protected ImageIcon createImageIcon(String path) {
        URL imgURL = getClass().getResource(path);
        if (imgURL != null) {

            return new ImageIcon(imgURL);

        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }


    public void saveDrawing() {

        File theFile = new File("Drawing.png");


        fc.setSelectedFile(theFile); //sets the file name field to "testfile.txt"
        int returnVal = fc.showSaveDialog(this);


        if (returnVal == JFileChooser.APPROVE_OPTION) {


            try {
                theFile = fc.getSelectedFile();
                ImageIO.write(bi, "png", theFile);
            } catch (Exception e) {
                System.out.println(e.getStackTrace());
            }
        }

    }


    public void keyReleased(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            left = false;
            break;
        case KeyEvent.VK_RIGHT:
            right = false;
            break;
        case KeyEvent.VK_UP:
            up = false;
            break;
        case KeyEvent.VK_DOWN:
            down = false;
            break;
        case KeyEvent.VK_SHIFT:
            hastighed = 20;
            break;
        }
    }

    public void keyTyped(KeyEvent e) {
        //Denne metode skal være implementeret!
    }


    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
        case KeyEvent.VK_LEFT:
            left = true;
            break;
        case KeyEvent.VK_RIGHT:
            right = true;
            break;
        case KeyEvent.VK_UP:
            up = true;
            break;
        case KeyEvent.VK_DOWN:
            down = true;
            break;
        case KeyEvent.VK_SHIFT:
            hastighed = 60;
            break;
        }

    }

    public void update(Graphics2D g) {
        paintComponent(g);
    }


    public void clearKanvas() {
        // Reset tegning på skærmen
        Graphics denne = this.getGraphics();
        denne.clearRect(0, 0, getWidth(), getHeight());

        // Reset tegning som skal gemmes til fil
        kanvasKopi = null;
        bi = null;
        bi = new BufferedImage(bredde, hoejde, BufferedImage.TYPE_INT_ARGB);
        kanvasKopi = bi.createGraphics();
    }


    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D)g; // cast g to Graphics2D

        if (clearKanvas) {
            kanvasKopi.clearRect(0, 0, getWidth(), getHeight());
            kanvasRenset = true;
            clearKanvas = false;
        }

        g2d.setStroke(new BasicStroke(1.7f));
        g2d.setColor(Color.DARK_GRAY.brighter());
        g2d.drawLine(posX, posY, posX,
                    posY); // (x-slut, y-slut, x-start, y-start)

        kanvasKopi.setStroke(new BasicStroke(1.7f));
        kanvasKopi.setColor(Color.DARK_GRAY.brighter());
        kanvasKopi.drawLine(posX, posY, posX,
                            posY); // (x-slut, y-slut, x-start, y-start)


    }


    public void resetCord() {

        posX = bredde / 2;
        posY = hoejde / 2;

    }

    public BufferedImage getDrawing() {

        return bi;
    }

    public boolean getkanvasRenset() {
        return kanvasRenset;
    }
}
Avatar billede Slettet bruger
14. april 2008 - 21:50 #10
Ovenstående er de 3 vigtigeste klasser.
Avatar billede Slettet bruger
14. april 2008 - 21:56 #11
Her kommer lige Frame1 klassen igen, da der lige var et par enkelte ændringer (ville ønske man kunne redigere i sine indlæg istedetfor):


package tegneprogram;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;

import javax.swing.*;


public class Frame1 extends JFrame {
    private int bredde, hoejde, tegningHoejde;


    private Tegning tegning;

    private JPanel headPanel = new JPanel();

    private JPanel containerPanel;

    private String saveFile;

    private JMenuBar menuBar = new JMenuBar();
    private JMenu menuFile = new JMenu();
    private JMenuItem menuFileExit = new JMenuItem();
    private JMenuItem menuFileClear = new JMenuItem();
    private JMenuItem menuFileSaveAs = new JMenuItem();
    private JMenu menuHelp = new JMenu();
    private JMenuItem menuHelpAbout = new JMenuItem();
    private JMenuItem menuHelpHelp = new JMenuItem();
    private JLayeredPane layerPane;

    Graphics2D grafik;

    private Dimension d;


    private JFileChooser fc = new JFileChooser();
    Baggrund baggrund;


    public Frame1(int bredde, int hoejde) {
        this.hoejde = hoejde;
        this.bredde = bredde;

        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void jbInit() throws Exception {


        this.setTitle("Etch-a-sketch");


        // MENUBAR //


        menuFileExit.setText("Quit Etch-a-sketch");
        menuFileExit.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileExit_ActionPerformed(ae);
                    }
                });

        menuFileClear.setText("Clear");
        menuFileClear.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileClear_ActionPerformed(ae);
                        //kanvas.requestFocus();
                    }
                });

        menuFileSaveAs.setText("Save As...");
        menuFileSaveAs.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        fileSaveAs_ActionPerformed(ae);
                        //kanvas.requestFocus();
                    }
                });

        menuFile.add(menuFileClear);
        menuFile.add(menuFileSaveAs);
        menuFile.add(menuFileExit);

        menuFile.setText("File");

        menuBar.add(menuFile);

        menuHelpHelp.setText("Etch-a-sketch Help");
        menuHelpHelp.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {

                        helpHelp_ActionPerformed(ae);

                    }
                });

        menuHelpAbout.setText("About");
        menuHelpAbout.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {

                        helpAbout_ActionPerformed(ae);

                    }
                });
        menuHelp.add(menuHelpHelp);
        menuHelp.add(menuHelpAbout);
        menuHelp.setText("Help");

        menuBar.add(menuHelp);

        ///////////////////////////////////////////////////////


        // LAYOUT

        headPanel.setLayout(new BorderLayout());

        containerPanel = new JPanel();
        containerPanel.setLayout(new BorderLayout());
        containerPanel.setPreferredSize(new Dimension(bredde, hoejde));


        d = headPanel.getPreferredSize();

        tegningHoejde = hoejde - d.height;

        tegning = new Tegning(bredde, tegningHoejde);

        baggrund = new Baggrund();
        layerPane = new JLayeredPane();
        layerPane.setLayout(null);

        layerPane.add(baggrund, 1);
        baggrund.setBounds(0, 0, bredde, tegningHoejde);
        layerPane.add(tegning, 0);
        tegning.setBounds(0, 0, bredde, tegningHoejde);

        containerPanel.add("Center", layerPane);

        containerPanel.setOpaque(false);

        this.setContentPane(containerPanel);

    }


    void fileExit_ActionPerformed(ActionEvent e) {
        System.exit(0);
    }

    void fileClear_ActionPerformed(ActionEvent x) {


        tegning.clearKanvas();

        tegning.resetCord();

        baggrund.redrawBG();

    }

    void fileSaveAs_ActionPerformed(ActionEvent x) {

        File theFile = new File("Drawing.png");
        saveFile = "yes";

        do {

            fc.setSelectedFile(theFile); //sets the file name field to "testfile.txt"
            int returnVal = fc.showSaveDialog(this);


            if (returnVal == JFileChooser.APPROVE_OPTION) {


                try {


                    theFile = fc.getSelectedFile();


                    if (theFile.exists()) {
                        int result =
                            JOptionPane.showConfirmDialog(this, "The selected file already exists. " +
                                                          "Do you want to overwrite it?",
                                                          "The file already exists",
                                                          JOptionPane.YES_NO_CANCEL_OPTION,
                                                          JOptionPane.QUESTION_MESSAGE);
                        switch (result) {
                        case JOptionPane.YES_OPTION:
                            saveFile = "yes";
                            break;
                        case JOptionPane.NO_OPTION:
                            saveFile = "no";
                            break;
                        case JOptionPane.CANCEL_OPTION:
                            saveFile = "cancel";
                            break;
                        }
                    }


                    if (saveFile == "yes") {
                        BufferedImage image =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        Graphics2D g2d = image.createGraphics();


                        BufferedImage baggrunden =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        baggrunden = baggrund.getBaggrund();

                        BufferedImage tegningen =
                            new BufferedImage(bredde, tegningHoejde,
                                              BufferedImage.TYPE_INT_ARGB);
                        tegningen = tegning.getDrawing();

                        g2d.drawImage(baggrunden, 0, 0,
                                      this); // Paint baggrund pŒ image!
                        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                                                    1f));
                        g2d.drawImage(tegningen, 0, 0, this);

                        ImageIO.write(image, "png", theFile);
                        g2d.dispose();
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            } else {
                saveFile = "cancel";
                System.out.println("xxx");
            }

        } while

        (saveFile == "no");


    }

    void buttonOpen_ActionPerformed(ActionEvent e) {
        System.out.println("Open!");
    }


    void helpHelp_ActionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, new Frame1_HelpBoxPanel1(),
                                      "Etch-a-sketch Help",
                                      JOptionPane.PLAIN_MESSAGE);

    }

    void helpAbout_ActionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(this, new Frame1_AboutBoxPanel1(),
                                      "About", JOptionPane.PLAIN_MESSAGE);

    }

    public JMenuBar getMBar() {
        return menuBar;
    }


}
Avatar billede Slettet bruger
15. april 2008 - 00:27 #12
Hmmm....beklager hvis jeg har hældt for megen skodkode over på forummet. :)

Har nu siddet og bakset med det et stykke tid, og fundet en nogenlunde løsning på det:
Jeg var oprindelig ude i noget med at have baggrunden og tegningen adskilt og så composite det i Framen, hvilket vist skabte en del problemer i Windows.
Nu tegner jeg hele tiden på den samme grafikfil som herefter tegnes på et JPanel, hvor baggrundsbilledet også ligger, og det ser ud til at fungere. Skal nok melde tilbage, når tingen fungerer 100%. Version 1.5 har jeg lagt ud på min site, og den skulle gerne fungere 95% korrekt i Windows. :) Eneste større problem, som jeg kan se det lige nu, er at min CPU går amok når jeg afvikler programmet, hvilket muligvis har noget at gøre med at den skal tegne hele skærmbilledet op 20 gange i sekundet....
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