【问题标题】:Drawing with graphics and with widgets in JApplet/Swing?在 JApplet/Swing 中使用图形和小部件绘图?
【发布时间】:2012-07-11 01:08:52
【问题描述】:

基本上我有一个 JApplet 尝试使用图形进行绘制(即 g.drawOval(10,10,100,100) 并且还包括 JCompotents(即 JButton)。发生的情况是重绘会变得非常古怪。

有时图形会覆盖小部件或反之亦然。它不可靠,会导致不可预测的行为。

(按钮也总是在这些图形的顶部)

我尝试过尝试覆盖或手动绘制组件、更改顺序等,但我认为我在这里遗漏了一些非常基本的东西。任何人都有使用 g.drawXXX 和 JCompotents 的模板或正确方法?

【问题讨论】:

  • 你需要在你绘制的地方显示你的代码以及任何其他相关的代码。否则,我们不知道您可能做错了什么。此外,请务必不要直接在 JApplet 中绘制,而是在 JPanel 或其 contentPane(即 JPanel)中绘制。确保在此 JPanel 的 paintComponent(...) 方法中进行绘制。
  • 检查usual suspects并将您的代码与AnimationTest进行比较。
  • @user1516346:肯定有很多例子在线和这个网站上,有些是我自己写的。不停寻找!你的问题只是你没有遵循我在第一篇文章中的任何建议。您仍然是直接在小程序中绘图。
  • "图片解释得更好:" 嗯..一张图片通常会画一千个单词,但可以总结为“但绘图出现在顶部组件”。
  • @HovercraftFullOfEels ,链接?我一直在寻找几个小时,但是由于您手头有很多示例,因此将不胜感激! :)

标签: java swing graphics paintcomponent japplet


【解决方案1】:

再次,按照我的建议,

请务必不要直接在 JApplet 中绘制,而是在 JPanel 或其 contentPane(即 JPanel)中绘制。确保在此 JPanel 的 paintComponent(...) 方法中进行绘制。

它的工作原理:

import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;

public class Test2 extends JApplet {


   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               Test2BPanel panel = new Test2BPanel();
               setContentPane(panel);
            }
         });
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      } catch (InterruptedException e) {
         e.printStackTrace();
      }

   }


}

class Test2BPanel extends JPanel {
   private String[] backgroundImageFileNames = { "test", "test", "test" };

   private JButton refreshButton;
   private JComboBox backgroundList;

   public Test2BPanel() {

      setBackground(Color.white);

      setLayout(new FlowLayout());

      refreshButton = new JButton("replant new forest");
      refreshButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {

         }

      });
      add(refreshButton);

      backgroundList = new JComboBox(backgroundImageFileNames);
      backgroundList.setSelectedIndex(2);
      add(backgroundList);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      paintIt(g);
   }

   public void paintIt(Graphics g) {
      for (int i = 0; i < 200; i++) {
         for (int j = 0; j < 200; j++) {
            g.setColor(Color.red);
            g.drawOval(10 * i, j, 10, 10);
         }
      }
   }
}

另外,请查看包含Basic Painting TutorialAdvanced Painting Tutorial 的Swing 绘画教程。

如需有关这方面和更多内容的精彩书籍,请考虑购买 Chet Haase 和 Romain Guy 的 Filthy Rich Clients。您不会后悔购买!这是我拥有的最好的 Java 书籍之一。

【讨论】:

  • 不客气。请阅读链接到我的答案底部的教程,了解详细信息。那就跑吧,不要去书店买 Haase 和 Guy 的 Filthy Rich Clients,了解你需要知道的一切以及更多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多