2011-07-12 15 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

相关问题