【问题标题】:Painting Graphics on JPanel without using PaintComponent method and repaint call在 JPanel 上绘制图形而不使用 PaintComponent 方法和重绘调用
【发布时间】:2011-10-04 15:22:41
【问题描述】:

我想在 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)。我看到无法启动 Graphics 类型,但也许有另一种类型可以让我这样做。

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

提前致谢。

【问题讨论】:

  • @mKorbel,在我来到这里之前,我浏览了所有这些 API 和教程。你甚至读过我的问题吗?
  • @Emir: “它有时会搞乱我程序的整体设计。” 除非你知道为什么它搞砸了,否则我怀疑使用建议的替代方法时问题会持续存在。
  • @Emir:“你有没有阅读我的问题?” -1 没有时间仔细阅读你的问题。如果你愿意,我会删除我的评论,而不是浏览细节。 (在你告诉我们之前,我们不知道你检查过,这是一个很好的建议。我们不是读心术的人。)
  • @Andew Thompson:请做。我已经处理这个问题一个星期了,在我来这里之前我阅读了所有内容。如果我分享它为什么会与我的程序的整体设计相混淆,它只会让评论员变得复杂。这不是问题所在,如果您阅读标题,它会说出我想知道的一切。一旦我能够做我在标题中所说的事情,我会尽快检查答案,这与我的整体程序无关。我做出了我的设计选择,不会回头。我的问题结构简单;我不要求程序员手册。

标签: java swing jpanel repaint paintcomponent


【解决方案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...
    }
}

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

编辑:

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

【讨论】:

  • 感谢您的回复。但我为什么要这样做?我可以在一堂课上完成所有这些。更重要的是,这仍然使用了paintComponent方法。谢谢你的尝试。
【解决方案2】:
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() {
    }
}

【讨论】:

  • 1) 这是您在此处发布的标题和代码,2) 其他绘画需要使用 JLabel(如此处所述),3) 您没有确切告诉我们您真正想要什么绘画,然后一些答案看起来像(对你来说)黑暗的镜头......因为你可以绘画到图像或图标并将其放到 JLabel 或......或...... 4)如果你想使用@ 987654323@然后看这里java2s.com/Code/Java/2D-Graphics-GUI/Catalog2D-Graphics-GUI.htm
【解决方案3】:

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

【讨论】:

  • BufferedImage 没有绘制方法。你能说得更具体点吗?
  • 它有一个 setRGB 函数,虽然它非常有用。只是不像油漆方法那样容易满足您的需求。您很可能必须逐个像素地工作。我将此添加到我的主要帖子中。
【解决方案4】:

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

【讨论】:

  • +1 代表implements Icon,代表example
  • 我想画图形。像 g.drawLine 等。我可以在图标类中做到这一点吗?
  • @Emir,您可以创建一个BufferedImage,获取它的Graphics 对象,在那里执行您的绘图任务,然后将BufferedImage 设置为JLabel 的图标。跨度>
  • @little bunny foo foo,听起来不错。我可以更改图标的坐标吗?
  • @Emir:如果您查看example,您会看到坐标和图形上下文提供给paintIcon()
猜你喜欢
  • 2014-10-02
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多