2011-07-12 46 views
0

我想將JPanel放在JApplet中,問題是我看不到它:(我已經覆蓋了我的JPanelpaintComponent以便有一個背景圖像,但我看不到任何東西當我刪除我已重寫的paintComponenet方法,併爲此面板的背景設置顏色時,看起來JPanel填充JApplet,仍然沒有組件可見: - S我已經嘗試了不同的佈局,我也將面板放在另一個面板的中間,該面板填滿了我的JApplet,但沒有任何變化,仍然沒有組件和無背景圖像可見:(我看不到我的JPanel及其組件在JApplet中

import java.awt.BorderLayout; 
import java.awt.Graphics; 

import javax.swing.ImageIcon; 
import javax.swing.JApplet; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 


public class Main extends JApplet implements Runnable{ 

private JTextArea display; 
private Thread outputThread; 
JPanel boardPanel; 

private ClientViewManager view; 

@Override 
public void init() { 

    try { 
     javax.swing.SwingUtilities.invokeAndWait(new Runnable() { 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } catch (Exception e) { 
     System.err.println("createGUI didn't successfully complete"); 
    } 

} 

private void createGUI() { 

    display = new JTextArea(4, 30); 
    display.setEditable(false); 
    getContentPane().add(new JScrollPane(display), BorderLayout.SOUTH); 

    setFocusable(true); 
    setVisible(true); 
    setName("CE Tanks"); 
    setSize(600, 600); 
    setLocation(100, 100); 

    boardPanel = new JPanel(); 
    boardPanel.setLayout(null); 
    boardPanel.setBackground(new java.awt.Color(128, 255, 255)); 
    getContentPane().add(boardPanel, BorderLayout.CENTER); 

} 

public void start() { 
    outputThread = new Thread(this); 
    outputThread.start(); 
} 

public void run() { 
       view = new ClientViewManager(); 
       boardPanel.add(view); 
       boardPanel.repaint(); 
       repaint(); 
    } 
} 


class ClientViewManager extends JPanel { 
private int rows=8; 
private int columns=8; 

public ClientViewManager() { 
    super(null); 

    JLabel lb= new JLabel("lb.jpg"); 
    lb.setLocation(10, 10); 
    lb.setSize(50, 50); 
    lb.setOpaque(false); 
    lb.setVisible(true); 

    this.add(lb); 
} 

public void paintComponent(Graphics g) { 

    g.drawImage(new ImageIcon("ground.jpg").getImage(), 0, 0, columns * 50, 
      rows * 50, this); 
} 

} 

上面的代碼可以編譯。我甚至不能將Keylistener添加到我的JPanel和我的JApplet。我用java.awt.KeyEventDispatcherdispatchKeyEvent(KeyEvent e)我在控制檯上打印了一些東西,但它被打印了3次。 :(

+0

little bunny foo foo是對的。 – MirroredFate

+2

@Maryam:*「Plzzzzzzzzz幫助」*請1)停止使用廢話拼寫,如「Plzzzzzzzzz」2)停止發送給我們。 3)問一個問題。 –

回答

5

我已經覆蓋了我的paintComponent JPanel的序有一個背景圖像,

但是你沒有自定義組件添加到您的小程序:

//boardPanel = new JPanel(); 
boardPanel = new ClientViewManager(); 

另外:

  1. 擺脫setVisible()。這不是您的程序中的任何控件所必需的。故障除了頂層容器(Jframe,JDialog等)之外的所有組件都已經可見。對於JApplet,您不需要使其可見,因爲這是顯示小程序的一部分。
  2. 擺脫setSize()和setLocation()你不能通過這種方式控制applet的位置。
  3. 不要在paintComponent()方法中讀取圖像文件。這是無效的,因爲只要Swing確定組件需要重新繪製,就會調用此方法。
  4. JLabel默認是不透明的,所以不需要調用setOpaque方法。
  5. 進行自定義繪畫時,您還應該重寫組件的getPreferredSize()方法以返回自定義繪畫的正確大小,以便佈局管理器可以使用此信息。它在這種情況下工作,因爲您已將面板添加到BorderLayout的中心。嘗試將面板添加到NORTH以查看會發生什麼。

編輯:

現在,我看到您要添加的ClientViewManager。我不知道你爲什麼試圖用線程來做到這一點,但又有幾個問題。

  1. 當添加/從visble GUI除去組件然後基本代碼是:

    panel.add(...);
    panel.revalidate();
    panel.repaint();

  2. 但是,這仍然不會工作,因爲您使用空佈局和麪板的大小爲0。使用合適的佈局管理器並按照上面的建議實施getPreferredSize()方法,並且組件將正確顯示。

+0

謝謝你回覆我,但我不能得到你的意思是「你沒有將自定義組件添加到你的applet」:「> [我把它放在run方法] BTW,我想我做了你說的,並且我推翻了getPreferredSize(),但sry我的JApplet仍然是空的:(我猜問題是與圖像有關,因爲我在裏面看到帶有文本的標籤,但面板沒有背景圖像:( – Maryam

+0

閱讀我的編輯。在init()方法中添加一個空面板,我給你的簡單解決方案是此時添加ClientViewManager。出於某種原因,在start()方法中,創建了一個Thread來添加ClientViewManager 。這是非常令人困惑的。 – camickr

+0

當我使用Appletviewer運行代碼時,圖像加載正常。一般情況下,當使用applet時,您不會使用ImageIcon來加載圖像。我建議您查看Swing教程「如何製作Applets「(http://download.oracle.com/javase/tutorial/uis wing/components/applet.html)以獲取如何加載圖像的示例。 – camickr

-4

我建議您使用Netbeans的GUI生成器來構建這樣的GUI,然後將生成的代碼與您的代碼進行比較。 Netbeans結果對於幫助您創建搖擺代碼非常有用。

+1

-1,這是一個評論,不是對問題的回答。即使這是一個答案,我也會投票給它,因爲你不應該將代碼與生成的代碼進行比較,因爲代碼生成永遠不會有效。 – camickr

+0

好吧,我同意這是一個評論,但是爲了解決這個問題,我可以想到更直接的方式,而不是在這裏和那裏更改代碼。 –

+0

我還沒有與Netbeans合作過,我想這需要一些時間來學習它。不幸的是,我沒有足夠的時間來學習它。我應該在下週發送我的作業。但是,謝謝你的建議,;) – Maryam

相關問題