如何在启动/初始化时更改/编辑JPanel对象

时间:2012-08-02 20:18:25

标签: java swing initialization jpanel jcomponent

我想在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);

    }
}

4 个答案:

答案 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)

问题

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

  2. JPanel红色Background

  3. 出了什么问题?
  4. 您在屏幕上显示之前清除JApplet

  5. 无效,因为无法正常工作

  6. 建议

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

感谢您的帮助!