在不使用PaintComponent方法和重绘调用的情况下在JPanel上绘制图形

时间:2011-07-13 15:55:14

标签: java swing jpanel repaint paintcomponent

我想在JPanel上绘制图形。现在,我正在做的是,我使用paintComponent方法来定义绘图:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLACK);
    g.fillRect(10,10,100,100);
}

然后,无论我想放置图形,我都会调用repaint()。

但是我想知道是否有一种方法可以将JP添加到JPanel,就像添加组件而不使用这个paintComponent方法一样:panel.add(myComponent)。我看到无法启动Graphics类型,但可能还有其他类型可以让我这样做。

我很确定很多GUI如FANG Engine都有这个选项,但我在Swing看到的所有例子都使用了这种方法。没有这个的建议吗?因为它有时会弄乱我的程序的整体设计。

提前致谢。

4 个答案:

答案 0 :(得分:4)

最简单的方法是创建一个自定义Icon对象,该对象负责您的绘画。然后,您可以通过JLabel将您的图标添加到面板(或将其放在按钮或任何其他带图标的组件上),同时抽象出绘画作品。

答案 1 :(得分:3)

您可以查看图像和缓冲图像apis。除了paintcomponent和graphics g之外,您还可以通过很多方式生成和处理缓冲图像。我想如果你生成缓冲图像,然后将它们加载到你的JPanel上,你将能够获得类似的效果。您可以使用setRGB方法绘制所需的内容。它不像绘画方法那样通用,但它是另一种选择。

答案 2 :(得分:0)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

    public static void main(String[] args) {
        JPanel viewportPanelTop = new JPanel();
        JPanel viewportPanelBottom = new JPanel();
        JPanel viewportPanelCenter = new JPanel();
        viewportPanelCenter.setBackground(Color.black);
        viewportPanelCenter.setPreferredSize(new Dimension(600, 400));
        JPanel viewportPanelWest = new JPanel();
        JPanel viewportPanelEast = new JPanel();

        JFrame frame = new JFrame();
        frame.setTitle("JFrame");
        frame.setLocation(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(viewportPanelTop, BorderLayout.NORTH);
        frame.add(viewportPanelWest, BorderLayout.WEST);
        frame.add(viewportPanelCenter, BorderLayout.CENTER);
        frame.add(viewportPanelEast, BorderLayout.EAST);
        frame.add(viewportPanelBottom, BorderLayout.SOUTH);
        frame.pack();
        frame.setVisible(true);
    }

    private Main() {
    }
}

答案 3 :(得分:0)

一个想法是将每个自定义绘画放在一个单独的JPanel中, 然后加上这个。

public class MyFrame extends JFrame {
    //initialize frame...
    //put your components

    //now put your jpanel
    MyPanel custom = new MyPanel();
    custom.setBounds(10, 10, 100, 100);

    this.add(custom);
}

public class MyPanel extends JPanel {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //draw your stuff...
    }
}

当然,这会让它变得不那么活跃......

编辑:

谈论分离,如果你想将你的屏幕分开,例如两部分: 一个用于自定义绘画,一个用于组件,例如用于游戏, 那么这个解决方案应该符合你的需求......