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.
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.
Synes godt om
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? :)
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....
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);
Synes godt om
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. :)
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();
/** Returns an ImageIcon, or null if the path was invalid. */ protected ImageIcon createImageIcon(String path) { URL imgURL = getClass().getResource(path); if (imgURL != null) {
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
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();
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; }
}
Synes godt om
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....
Synes godt om
Ny brugerNybegynder
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.