2

我想在启动/初始化时更改小程序中的 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);

    }
}
4

4 回答 4

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();

        }

    }

}
于 2012-08-02T21:58:39.040 回答
2

问题

  1. 不知道为什么要在没有任何自定义绘画的情况下清除空的JPanel

  2. JPanel红色有什么问题Background

  3. 在屏幕上可见之前清除JApplet

  4. 不能正常工作,因为没有任何作用

建议

于 2012-08-02T20:48:50.867 回答
2

每当您在对您的paint()paintComponent()方法的通常系统调用之外进行任何自定义绘制时,您必须调用invalidate()您希望重新绘制的任何组件。所以对于你的erasePanel()方法,我建议设置一些标志然后调用panel.invalidate(). 然后在面板的paintComponent()方法中,您可以检查标志以查看是否需要绘制介绍性图片或将面板留空。

于 2012-08-02T22:08:11.567 回答
1

好的,问题似乎是我的编码很糟糕。我想通过另一个类的方法更改面板对象,但这不是这样做的方法。我重写了我的代码并创建了一个面板类,其中使用paintcomponent 完成绘画。我现在使用这个面板类的对象,它会在启动时显示我想要的图形。

谢谢您的帮助!

于 2012-08-02T22:29:35.707 回答