Java JComponent 绘制——几乎可以工作

2024-03-26

我几乎让 repaint() Jcomponent 工作了。我让它工作,然后尝试进行绝对定位,但现在不起作用。

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public class DDHGenericFrame {
        private static final long serialVersionUID = 1L;
        DDHGenericPanel d = new DDHGenericPanel(); 
        //DDHCircleOne o = new DDHCircleOne();

        public DDHGenericFrame() {
            initUI();
        }

        public final void initUI() {
              JFrame frame = new JFrame("AbsoluteLayoutDemo");
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setTitle("Draw Circle");
              frame.setBackground(Color.green);
              frame.setLayout(null);
              frame.setSize(300,425);
              frame.add(d);
//            frame.add(o);//didn't work neither
              frame.setVisible(true);
        }

        public static void main(String[] args) {
            DDHGenericFrame ex = new DDHGenericFrame();
        }
}

类2:(这是我试图设置的JComponent)

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JComponent;

public class DDHTestDraw extends JComponent {
    public DDHTestDraw () {
        settPreferredSize();
    }

    public void settPreferredSize() {
        Dimension d = new Dimension(25,25);
        setPreferredSize(d);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("Text",20,20);
    }
}

我将组件添加到容器中,然后将容器添加到 JPanel 中,然后将 JPanel 添加到 JFrame 中。我认为这应该有效。我有一套首选尺寸。我曾经可以用,但现在不行了。

我希望能够制作一个圆形组件。我希望该圆能够在 Jframe 上的任何位置绘制,然后我希望该圆能够根据一定的时间长度移动。我将制作一款游戏,其中的圆圈从顶部下降,然后落到底部。当我让它工作时,我确实将圆圈写入了 JPanel,这是一段复杂的代码。但我不得不回到以前简单的写单个图形单词的方法。


  • 当您使用空布局时,you完全负责确保添加的组件具有正确的位置和size(不是首选尺寸)设置。
  • 您几乎不应该使用空布局。
  • Wouldn't this sort of thing work better by creating a logical class to represent the Circle, not a component? Then your drawing JPanel could hold a collection of logical circles, and the drawing JPanel could be responsible for drawing each Circle in its paintComponent method.

Edit
您的评论/我的回复:

当你说永远不要使用绝对布局时,我工作的公司总是只使用绝对布局。

有时它很有用,但不适用于创建典型的组件填充 GUI。否则 GUI 会变得很难修改和维护。

当您指的是逻辑类时,您指的是仅创建一个圆的类。

是的,它包含了该圆的所有必要属性,例如它的颜色、位置、运动等。

然后 Jpanel 会绘制每个圆圈。

是的。我想象绘图 JPanel 有一个ArrayList<MyCircle>其中,paintComponent 方法迭代此列表。

当你说 Size 时,这是 JComponent 中的一个属性。

我认为它是 Component(JComponent 的父级)的属性。如果使用空布局,则所有组件must指定它们的大小和位置。否则,组件默认位置为 [0, 0],大小为 [0, 0]。


Edit 2

public Dimension Size(int a, int b) { 
   Dimension d = new Dimension(); 
   d.width = a; 
   d.height = b; 
   return d; 
}

这是我用于首选尺寸的代码。我不知道为什么这不起作用。

此代码对 Component/JComponent 的大小或 PreferredSize 属性没有影响。它对你没有帮助,我并不感到惊讶。你要么必须重写getSize() or getPreferredSize()或显式调用setSize(...) or getPreferredSize(...)更改属性的状态。

我将尝试使用不同的布局管理器并查看,但我会看到一个布局管理器或另一个布局管理器之间的差异。

我不知道如何解释这一点。


Edit 3
你说:

我在一家公司工作,我们一直使用绝对布局。绝对布局怎么会不如 BorderLayout() 那样好呢?对我来说,BorderLayout() 更难实现。或者是使用 Jframe() 和 BorderLayout,然后将 Jpanel 插入到已经存在的位置,该位置也已经是 BorderLayout()。我总是很难在与 BorderLayout() 不同的布局中正确获取按钮和位置。您可以发布一个比以下更容易使用的示例吗

我猜您想要一个使用布局管理器比使用绝对定位更容易的示例。

让我们以一个非常简单的计算器为例,它带有用于数字输入和简单操作的按钮。这个例子又是very基本的,非功能性的,但用于说明布局的使用。我可以轻松地将按钮放置在 GridLayout-使用 JPanel 中,然后将该按钮 JPanel 放置到 BorderLayout-使用 JPanel 中的 BorderLayout.CENTER 位置,并与 JTextField 一起显示,放置在相同的 BorderLayout-使用 JPanel 中的 BorderLayout.PAGE_START位置:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;

public class CalcEg {
   private static final float BTN_FONT_SIZE = 20f; 
   private static final String[][] BTN_LABELS = {
      {"7", "8", "9", "-"},
      {"4", "5", "6", "+"},      
      {"1", "2", "3", "/"},
      {"0", ".", " ", "="}
   };
   private static final int GAP = 4;
   private JPanel mainPanel = new JPanel(new BorderLayout(GAP, GAP));
   private JPanel buttonPanel = new JPanel();
   private JTextField display = new JTextField();

   public CalcEg() {
      int rows = BTN_LABELS.length;
      int cols = BTN_LABELS[0].length;
      buttonPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
      for (String[] btnLabelRow : BTN_LABELS) {
         for (String btnLabel : btnLabelRow) {
            if (btnLabel.trim().isEmpty()) {
               buttonPanel.add(new JLabel());
            } else {
               JButton btn = createButton(btnLabel);
               buttonPanel.add(btn);
            }
         }
      }
      display.setFont(display.getFont().deriveFont(BTN_FONT_SIZE));
      display.setEditable(false);
      display.setFocusable(false);
      display.setBackground(Color.white);

      mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      mainPanel.add(buttonPanel, BorderLayout.CENTER);
      mainPanel.add(display, BorderLayout.PAGE_START);
   }

   private JButton createButton(String btnLabel) {
      JButton button = new JButton(btnLabel);
      button.setFont(button.getFont().deriveFont(BTN_FONT_SIZE));
      return button;
   }

   public JComponent getMainComponent() {
      return mainPanel;
   }

   private static void createAndShowGui() {
      CalcEg mainPanel = new CalcEg();

      JFrame frame = new JFrame("CalcEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel.getMainComponent());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这将产生一个如下所示的计算器:

现在,您肯定可以说您可以使用空布局来生成它,并且setbounds(...),这一切都很好,但现在说您对这个计算器不满意,现在希望它具有一些科学计算功能。说你现在想要添加按钮对于平方、平方根、指数和对数,但不仅如此,假设您希望在显示屏下方、数字和基本操作按钮上方添加按钮。如果您要使用空布局来执行此操作,则必须重新定位添加的任何新组件下方和右侧的所有组件,并且必须扩大 JTextField 的大小,所有计算都很繁琐且容易出现问题错误。

如果您使用布局管理器,则只需添加一行代码,实际上是向数组添加一行:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;

public class CalcEg {
   private static final float BTN_FONT_SIZE = 20f; 
   private static final String[][] BTN_LABELS = {
      {"sqr", "sqrt", "exp", "log"}, // ******* Line Added Here *********
      {"7", "8", "9", "-"},
      {"4", "5", "6", "+"},      
      {"1", "2", "3", "/"},
      {"0", ".", " ", "="}
   };
   private static final int GAP = 4;
   private JPanel mainPanel = new JPanel(new BorderLayout(GAP, GAP));
   private JPanel buttonPanel = new JPanel();
   private JTextField display = new JTextField();

   public CalcEg() {
      int rows = BTN_LABELS.length;
      int cols = BTN_LABELS[0].length;
      buttonPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
      for (String[] btnLabelRow : BTN_LABELS) {
         for (String btnLabel : btnLabelRow) {
            if (btnLabel.trim().isEmpty()) {
               buttonPanel.add(new JLabel());
            } else {
               JButton btn = createButton(btnLabel);
               buttonPanel.add(btn);
            }
         }
      }
      display.setFont(display.getFont().deriveFont(BTN_FONT_SIZE));
      display.setEditable(false);
      display.setFocusable(false);
      display.setBackground(Color.white);

      mainPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      mainPanel.add(buttonPanel, BorderLayout.CENTER);
      mainPanel.add(display, BorderLayout.PAGE_START);
   }

   private JButton createButton(String btnLabel) {
      JButton button = new JButton(btnLabel);
      button.setFont(button.getFont().deriveFont(BTN_FONT_SIZE));
      return button;
   }

   public JComponent getMainComponent() {
      return mainPanel;
   }

   private static void createAndShowGui() {
      CalcEg mainPanel = new CalcEg();

      JFrame frame = new JFrame("CalcEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel.getMainComponent());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

这将导致这个 GUI:

这又是一个非常简单的示例,但一般原则适用于任何包含 JButtons、JTextComponents 等组件的 GUI。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java JComponent 绘制——几乎可以工作 的相关文章

  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 使用 Spring MVC 返回 PDF 文件

    实际上 我有这个功能 我有一个框架 可以在其中设置 URL ip port birt preview report report rptdesign format pdf parameters 并且该框架呈现 PDF 文件 但我想隐藏该网址
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 使用 xuggle 将 mp3 转换为 wav 出现异常

    我正在尝试将 mp3 转换为 wav 代码在这里 String mp3 F work pic2talk38512 mp3 String wav F work pic2talk38512 wav TranscodeAudioAndVideo
  • 警告:跳过条目,因为它不是绝对 URI。 NetBeans 中的 GlassFish

    我成功安装了 GlassFish 但是 当我启动服务器时 我收到两条警告消息 警告 跳过条目 因为它不是绝对 URI 那是关于什么的 Launching GlassFish on Felix platform Aug 09 2014 10
  • Java 9 中可以使用提前编译吗?

    As per JEP 295 http openjdk java net jeps 295 任何 JDK 模块 类或用户代码的 AOT 编译都是实验性的 JDK 9 中不支持 要使用 AOT 化的 java base 模块 用户必须编译该模
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • 隐藏类的 System.out.print 调用

    我正在使用 java 库 jar 文件 该文件的作者放入了一堆System out print and System out printlns 有没有办法隐藏特定对象的这些消息 编辑 看起来jar文件似乎正在创建一堆线程 并且每个线程都有它
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • 将多个视频文件合并到一个文件中

    我有多个以相同帧速率和分辨率录制的视频 我想将两个视频合并为一个视频 因此结果文件将是大视频 我正在使用 MP4 解析器 api 并使用下面的代码 Movie countVideo new MovieCreator build Channe
  • 给定一个单词列表 - 在 java 中完成单词的好的算法是什么?权衡:速度/效率/内存占用

    我正在探索潜在的免费 付费应用程序的硬件 软件要求 最终目标是移动 Java 应用程序 该应用程序将从这个简单的目标开始 给定数据库中相关单词的列表 能够对单个字符串输入进行单词补全 换句话说 我已经知道数据库的内容 但算法的内存占用 速度
  • 在 JavaFX 中拖动未装饰的舞台

    我希望将舞台设置为 未装饰 使其可拖动且可最小化 问题是我找不到这样做的方法 因为我遇到的示例是通过插入到主方法中的方法来实现的 我想通过控制器类中声明的方法来完成此操作 就像我如何使用下面的 WindowClose 方法来完成此操作 这是
  • 使用 CrudRepository 进行自定义查询

    我想使用 CrudRepository 自定义查询 这是我的代码 Repository public interface CustomerRepository extends CrudRepository
  • activemq 的优先级

    我们目前正在使用 JMS 和 activemq 5 5 1 开发一个应用程序 我们想为某些消息定义更高的优先级 这将使它们首先被消耗 设置生产者和消费者后 通过spring 3 1 JMSTemplate 优先级并不能完全发挥作用 事实上
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • Akka 和 spring 配置

    我正在尝试将 akka 与 spring 结合起来 但没有成功 基本上 我的应用程序似乎不习惯读取 akka 模式 具有架构的 service context xml 的一部分
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe

随机推荐

  • Google App Engine 始终开启功能

    有人可以解释一下 Google App Engine 中的 始终开启 功能是什么吗 它有什么用 举例说明将不胜感激 始终开启功能是否适用于任务队列 基本上 Google 会在没有流量时关闭应用程序引擎应用程序实例 通过此功能 您可以支付额外
  • 在reactJs中添加动态状态

    我创建了一个 ReactJs 页面 允许管理员将用户添加到平台 现在 管理员可以在提交表单之前添加尽可能多的用户 而不是为每个新用户提交表单 默认情况下 会显示一个包含输入字段的表行 然后单击 添加 按钮 会添加一个新行 管理员可以填写必要
  • 在 rspec 测试中发布到不同的控制器

    如何发布到与测试脚本当前指向的控制器不同的控制器 例子 在 user controller spec rb 中 it should just post to users do post create params this goes to
  • 运行maven时禁止Jasper库下载:mvn package

    我正在下载 Intellij Idea 中的 Spring 项目所需的所有库 我正在使用maven mvn包 除了被禁止的库之外 所有库都成功了 ERROR Failed to execute goal on project remax s
  • 当缓冲区只读时定义键

    当我的缓冲区是只读的 是的 我很懒 时 我尝试以与 C n 和 C p 相同的方式使用键 n 和 p 我在 emacs 文件中使用此代码 when buffer read only local set key n next line whe
  • CefSharp ChromiumWebBrowser - 未显示/渲染

    我有一个简单的应用程序 Grid with a ChromiumWebBrowser里面 当我创建ChromiumWebBrowser在 XAML 中 它可以工作 但是当我从代码隐藏创建它并将其添加到网格时 它不会显示 我只得到网格的黑色背
  • 仅从datetime sql获取日期而不转换为varchar,以便我可以在excel中对其进行排序

    当前 sql 返回日期为 2013 07 01 00 00 00 000 我只想要 mm dd yyyy 格式的日期部分 这样当我将其导出到 Excel 时 我仍然可以根据升序或降序进行排序 我尝试了 varchar 但它没有在 Excel
  • 限制代理可以建立的链接数量

    我有乌龟链接 如果它们的 var1 具有相同的值 这很好 我想将链接数量限制为三个 我在代码的链接部分之前添加了一个 IF 语句 If count my links lt 3 但不起作用 代理继续链接超过我设置的最大值 我读了另一个问题如何
  • 是否可以使用 PIL 减少图像的深度?

    是否可以使用 PIL 减少图像的深度 比如说从常规 8bpp 变为 4bpp 您可以轻松转换图像模式 只需调用im convert newmode 在图像对象上im 它会给你一个新的所需模式的新图像 但没有 4bpp 的模式 列出了支持的模
  • Angular2-mdl 和 webpack

    我已按照以下位置提供的步骤进行操作https www npmjs com package angular2 mdl https www npmjs com package angular2 mdl并使 Angular2 mdl 完美工作 但
  • 如何获取 Kotlin AST?

    我有一个包含 Kotlin 源代码的字符串 如何在运行时编译它并获取抽象语法树和类型信息进行分析 我对 Kotlin 编译器进行了一些调查 一些获得 AST 的概念证明可以在我的网站上看到GitHub 仓库 https github com
  • 使用 Microsoft Git Provider 时,为什么无法在 Visual Studio 2012 的 TFS 插件中查看工作平面?

    自从我安装了微软 Git 提供商与我托管的 Git 控制的 项目完全集成tfs visualstudio com the My Work窗格上的VS2012 的 TFS 插件 顺便说一句 我正在使用VS2012 Ultimate 不再出现
  • 如何在用户触摸图像时擦除图像的一部分

    我的总体目标是在图像上有一个灰色区域 然后当用户摩擦该灰色区域时 它会显示下面的图像 基本上就像一张彩票刮刮卡 我已经在文档和该网站上进行了大量搜索 但找不到解决方案 以下只是测试根据用户触摸位置 擦除 图像的概念证明 但它不起作用 我有一
  • 使用 OTP 原理的非阻塞 TCP 服务器

    我开始学习 Erlang 所以我尝试写 hello world 并发编程 IRC 机器人 我已经使用 Erlang 编写了一个 没有任何 OTP 细节 管理程序 应用程序等行为 我希望使用 OTP 原则重写它 但不幸的是我无法找出使用 OT
  • Javascript 不会加载到 ajax div 中

    我有一个非常简单的 ajax 脚本 用于将 HTML 文件加载到 div 中 该脚本如下所示
  • Java Swing 计时器和动画:如何将它们组合在一起

    我将再次重新发布这个问题 试图更准确 并希望我能得到一些帮助 因为这让我发疯 我正在开发一款最多 6 名玩家的棋盘游戏 每个玩家都有一个不同颜色的棋子 我将以下图像加载到 BufferedImage 数组中 并将其视为精灵 这是相关代码 将
  • ASP.NET 如何在其通用错误处理程序中获取行号

    每个人都熟悉 ASP NET 的默认错误处理程序 黄色框包含源错误 发生错误的 5 行代码 和源文件 文件名和行号 如下所示 Source Error Line 48 public ActionResult TriggerException
  • 如何在 firebase 版本 9 (firebase v9) 中初始化 firebase?

    我曾经使用此方法初始化我的 firebase 应用程序 import firebase from firebase app import firebase auth const config apiKey process env NEXT
  • 带钩子的 React-Table 失去了对表内输入的关注?

    代码沙盒 https codesandbox io embed react table editable content ggvcy https codesandbox io embed react table editable conte
  • Java JComponent 绘制——几乎可以工作

    我几乎让 repaint Jcomponent 工作了 我让它工作 然后尝试进行绝对定位 但现在不起作用 import java awt Color import java awt event ActionEvent import java