1

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

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

然后我在要放置图形的任何地方调用 repaint() 。

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

我很确定很多图形用户界面(例如 FANG Engine)都有这个选项,但是我在 Swing 中看到的所有示例都使用这种方法。没有这个有什么建议吗?因为它有时会扰乱我程序的整体设计。

提前致谢。

4

4 回答 4

4

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

于 2011-07-13T16:02:42.143 回答
3

您可以查看图像和缓冲图像 api。除了绘画组件和图形 g 之外,您还可以通过多种方式生成和处理缓冲图像。我想如果您生成缓冲图像然后将它们加载到您的 JPanel 上,您将能够获得类似的效果。您可以使用 setRGB 方法来绘制您想要的内容。它不像油漆方法那样通用,但它是一种替代方法。

于 2011-07-13T16:11:49.297 回答
1

一个想法是将每个自定义绘画放在一个单独的 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...
    }
}

当然,这会让它变得不那么动态......

编辑:

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

于 2011-07-14T12:17:37.323 回答
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() {
    }
}
于 2011-07-13T17:06:44.280 回答