我想在startup / init中更改applet中的JPanel对象。我无法弄清楚如何做到这一点。我做了一个简单的例子,说明了我清除JPanel的问题。当它被init()方法调用时它不起作用,但是当我按下按钮时它可以工作。如何在启动/初始化时更改JPanel?
import javax.swing.JApplet;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class TestStartUpApplet extends JApplet {
JPanel panel;
@Override
public void init() {
System.out.println("Init");
erasePanel();
}
private void erasePanel() {
Graphics g = panel.getGraphics();
g.clearRect(0, 0, 117, 48);
}
public TestStartUpApplet() {
getContentPane().setLayout(null);
panel = new JPanel();
panel.setBackground(Color.RED);
panel.setBounds(35, 36, 117, 48);
getContentPane().add(panel);
JButton btnTest = new JButton("Test");
btnTest.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
erasePanel();
}
});
btnTest.setBounds(35, 108, 117, 25);
getContentPane().add(btnTest);
}
}
答案 0 :(得分:3)
适合我:
public class AppletPaintTest extends JApplet {
@Override
public void init() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
setLayout(new BorderLayout());
ImagePane pane = new ImagePane();
pane.setBackground(Color.RED);
pane.setOpaque(false); // Little trick
add(pane);
}
});
}
@Override
public void start() {
super.start();
}
public class ImagePane extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
Insets insets = getInsets();
int x = insets.left;
int y = insets.top;
int width = getWidth() - 1 - (insets.left + insets.right);
int height = getHeight() - 2 - (insets.top + insets.bottom);
g2d.setColor(getBackground());
g2d.fillRect(x + 10, y + 10, width - 20, height - 20);
g2d.dispose();
}
}
}
答案 1 :(得分:2)
问题
不知道为什么要在没有任何自定义绘画的情况下清除空JPanel
JPanel
红色Background
您在屏幕上显示之前清除JApplet
无效,因为无法正常工作
建议
请勿使用AbsoluteLayout,请改用<{3}}
Graphics g = panel.getGraphics();
对LayoutManager有用,或保存printing to the printer,请勿将此方法用于其他原因
阅读Graphics to the image的工作原理
如果您不想将GUI发布到网络浏览器,可能会使用JApplet
可能会阅读有关JFrame
答案 2 :(得分:2)
每当您在通常的系统调用之外进行任何自定义绘制时,都必须在要重新绘制的任何组件上调用paint()
。{1}}或paintComponent()
方法。因此,对于invalidate()
方法,我建议设置一些标记,然后调用erasePanel()
。然后在面板的panel.invalidate()
方法中,您可以检查标记以查看是否需要绘制介绍性图片或将面板留空。
答案 3 :(得分:1)
好吧,问题似乎是我的编码很糟糕。我想通过另一个类中的方法更改面板对象,这不是这样做的方法。我重写了我的代码并创建了一个面板类,其中使用paintcomponent完成绘制。我现在使用这个面板类的对象,它在启动时显示我想要的图形。
感谢您的帮助!