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 绘制——几乎可以工作 的相关文章

  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 我所有的 java 应用程序现在都会抛出 java.awt.headlessException

    所以几天前我有几个工作Java应用程序使用Swing图书馆 JFrame尤其 他们都工作得很好 现在他们都抛出了这个异常 java awt headlessexception 我不知道是什么改变了也许我的Java版本不小心更新了 谢谢你尽你
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • 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