gpt4 book ai didi

java - 我在 JApplet 中看不到我的 JPanel 及其组件

转载 作者:行者123 更新时间:2023-12-01 15:48:20 24 4
gpt4 key购买 nike

我想将 JPanel 放入 JApplet 中,问题是我看不到它:(我已经重写了 paintComponent我的 JPanel 的 code> 以获得背景图像,但我看不到任何东西。当我删除我覆盖的 paintComponenet 方法并设置颜色时到这个面板的背景,似乎 JPanel 填充了 JApplet 并且仍然没有可见的组件:-S 我尝试了不同的布局。我也将我的面板放入另一个面板的中心填充了我的 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.KeyEventDispatcher 并在dispatchKeyEvent(KeyEvent e) 中我在控制台中打印了一些内容,但是打印了 3 次。 :(

最佳答案

I've overridden the paintComponent of my JPanel inorder to have a background image,

但是您没有将自定义组件添加到您的小程序中:

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

另外:

  1. 摆脱 setVisible()。程序中的任何控件都不需要这样做。默认情况下,除了顶级容器(Jframe、JDialog 等)之外的所有组件都已经可见。对于 JApplet,您不需要使其可见,因为这是显示小程序过程的一部分。
  2. 去掉 setSize() 和 setLocation(),这样你就无法控制小程序的位置了。
  3. 不要在paintComponent()方法中读取图像文件。这效率不高,因为每当 Swing 确定组件需要重新绘制时就会调用此方法。
  4. JLabels 默认情况下是不透明的,因此无需调用 setOpaque 方法。
  5. 在进行自定义绘画时,您还应该重写组件的 getPreferredSize() 方法,以返回自定义绘画的正确大小,以便布局管理器可以使用此信息。它在这种情况下有效,因为您将面板添加到了 BorderLayout 的中心。尝试将面板添加到北部,看看会发生什么。

编辑:

现在我知道您在哪里添加 ClientViewManager。我不确定您为什么尝试使用线程来执行此操作,但又出现了几个问题。

  1. 当您从可见 GUI 添加/删除组件时,基本代码是:

    panel.add(...);
    panel.revalidate();
    面板.重绘();

  2. 但是这仍然不起作用,因为您使用的是空布局并且面板的大小为 0。使用适当的布局管理器并按照上面的建议实现 getPreferredSize() 方法,组件将被显示正确。

关于java - 我在 JApplet 中看不到我的 JPanel 及其组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6670549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com