2014-05-24 38 views
0

我對JApplet有問題。代碼工作得很好,但是當我將它從JFrame轉換爲JApplet時,渲染部分停止正常工作。基本上我試圖做的是簡單的繪製應用程序。啓動applet時,一半時間repaint()不起作用(沒有灰色背景;必須將鼠標放在按鈕上才能更新其顏色等),而且像素渲染部分根本沒有顯示出來。下面的代碼:Java JApplet呈現問題

Frame類(JApplet的)

package painter; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Frame extends JApplet { 

public JPanel panel; 
private JButton plus, minus, buttonColor; 
private int scaleSize; 
private JLabel labelScale; 
private final Timer updateTimer; 
private static boolean painting = false; 
public static Color currentColor; 
public static int mode = 0; 
// 0 = draw; 1 = setcolor; 2 = erase 

private ArrayList<Pixel> pixelArray; 

public Frame() { 

    pixelArray = new ArrayList<>(); 
    for (int i = 1; i <= 8; i++) { 
     for (int j = 1; j <= 8; j++) { 
      pixelArray.add(new Pixel(i, j)); 
     } 
    } 

    setLayout(new BorderLayout()); 
    panel = new JPanel() { 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      //g.fillRect(10, 10, 100, 100); <- test if fillRect works at all. Yus it does. 
      for (int i = 0; i < pixelArray.size(); i++) { 
       pixelArray.get(i).render(g); 
      } 
      Toolkit.getDefaultToolkit().sync(); 
      g.dispose(); 
     } 

    }; 

    //panel.setBounds(0, 0, 800, 800); 
    //add(panel); 
    getContentPane().add(panel); 
    //panel.setLayout(null); 
    //panel.setOpaque(true); 

    //panel.setDoubleBuffered(true); 
    currentColor = Color.yellow; 

    buttonColor = new JButton("Choose color"); 
    buttonColor.setBounds(10, 10, 128, 64); 
    buttonColor.setBackground(currentColor); 
    buttonColor.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      currentColor = JColorChooser.showDialog(null, "JColorChooser Sample", Color.gray); 
     } 

    }); 

    updateTimer = new Timer(20, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      buttonColor.setBackground(currentColor); 
      repaint(); 
     } 

    }); 
    updateTimer.start(); 
    addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      painting = true; 
     } 
    }); 
    addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      painting = false; 
     } 
    }); 

    panel.add(buttonColor); 

    repaint(); 
} 

public static boolean getPaint() { 
    return painting; 
} 

public static void main(String[] args) { 
    new Frame(); 
} 
} 

這裏是像素級:

package painter; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.MouseInfo; 
import java.awt.Point; 

public class Pixel { 

private Color color; 
private int size; 
private int x, y, relativex, relativey; 

public Pixel(int relx, int rely) { 
    color = new Color(0x999999, false); 
    size = 32; 
    x = relx * size + 64; 
    y = rely * size + 64; 

} 

public boolean mouseOver() { 
    Point pos, mousepos; 
    pos = new Point(x, y); 
    mousepos = MouseInfo.getPointerInfo().getLocation(); 
    if ((mousepos.x > pos.x) 
      && (mousepos.x < pos.x + size) 
      && (mousepos.y > pos.y) 
      && (mousepos.y < pos.y + size)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

public void render(Graphics g) { 
    g.setColor(color); 
    if (mouseOver() && Frame.getPaint()) { 

     if (Frame.mode == 0) { 
      color = Frame.currentColor; 
     } 
     if (Frame.mode == 1) { 
      Frame.currentColor = color; 
     } 
     if (Frame.mode == 2) { 
      color = new Color(0xffffffff, true); 
     } 
    } 

    g.fillRect(x, y, size, size); 
    if (mouseOver()) { 
     g.setColor(Color.black); 
     g.drawRect(x, y, size - 1, size - 1); 
     g.setColor(Color.yellow); 
     g.drawRect(x + 1, y + 1, size - 3, size - 3); 
    } 
    //g.fillRect(10, 10, 250, 250); 
} 

} 
+0

*」 ..但是,當我把它轉換從JFrame中到JApplet的「* *爲什麼*您是否將其從框架轉換爲小程序,而不是使用[Java Web Start](http://stackoverflow.com/tags/java-web-start/info)從鏈接啓動(工作)框架? –

+0

*「還有更多..」*哇那裏。 SO不是'一站式服務檯',而是一個問答網站。說到這個,你的具體*問題*是什麼?爲了更快地提供更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整和可驗證示例)。 –

+0

@AndrewThompson這個項目從一開始就應該是一個小程序,但是我首先將其作爲JFrame,因爲它更容易測試,而且運行起來更少。此外,我只是想提供證據表明渲染不起作用,我唯一的問題就是爲什麼。 – Arvy

回答

2

如在黑暗中刺,不叫Graphics#diposeGraphics環境下,你沒有創建自己明確

除了事實的Graphics上下文是一個共享的資源,所有的組件使用可能需要在給定的油漆週期內進行噴漆,也可以防止在某些平臺上顯示的油漆

在15年的專業發展中,我從來沒有理由致電Toolkit.getDefaultToolkit().sync();。我懷疑它會做出多大區別,我只是說

+0

我找到了解決方案:MouseInfo.getPointerInfo()。由於某種原因,getLocation()只會將所有東西混淆。但我覺得你的提示很有幫助,因此我會給你最好的答案。 – Arvy

+0

請勿使用'MouseInfo',使用'MouseListener'或'MouseMotionListener' – MadProgrammer

0

Java小程序爲我們提供了這些方法

[這裏] http://docs.oracle.com/javase/tutorial/deployment/applet/appletMethods.html

該方法

public void paint(Graphics g){} 

被用作

public void paintComponent(Graphics g){} 
擺動的

替代。

+0

沒有提到,但我嘗試了一切:paint,paintComponent,甚至在JApplet中繪製方法。不解決問題。 – Arvy

+1

其實,你有那種落後。像JApplet這樣的頂級容器只有一種繪製方法,這是有意的,因爲大多數Swing頂級容器還包含其他組件,JRootPane,內容通道和可能的玻璃窗格,所以提供paintComponnent方法是沒有意義的,因爲它會被其他東西覆蓋。從JComponent擴展的組件具有,除其他繪畫方法之外,paintCompnent,它提供了一種方法,通過它可以輕鬆地定製繪畫 – MadProgrammer