《Java核心技术 卷I》JFrame组件中显示信息

组件中显示信息

JFrame结构复杂,由四层窗格,其中根窗格、层级窗格和玻璃窗格人们并不太关心,他们要用来组织菜单栏和内容窗格以及实现观感,Swing程序员最关心的是内容窗格(content pane),添加到窗体的所有组件都会自动添加到内容窗格中。

JFrame的内部结构

将一个组件添加到窗体中,消息将绘制在这个组件上,要在一个组件上绘制,需要定义一个拓展JComponent的类,并覆盖其中的paintComponent方法。此方法只有一个Graphics类型的参数,对于屏幕来说,画笔对象的度量单位是像素,坐标(0,0)指示所绘制组件的的左上角。

案例如下:

java 复制代码
package notHelloWorld;

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

import javax.swing.JComponent;
import javax.swing.JFrame;

public class NotHelloWorld {

    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            var frame = new NotHelloWorldFrame();
            frame.setTitle("非你好世界");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            
        });
    }

}

class NotHelloWorldFrame extends JFrame {
    public NotHelloWorldFrame() {
        add(new NotHelloWorldComponent());
        pack();
    }
}

class NotHelloWorldComponent extends JComponent {
    
    public static final int MESSAGE_X = 75;
    public static final int MESSAGE_Y = 100;
    
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT  = 200;
    //画字符串
    @Override
    protected void paintComponent(Graphics g) {
        g.drawString("不是你好世界程序", MESSAGE_X, MESSAGE_Y);
    }
    //尺寸,参考大小
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

javax.swing.JFrame 1.2

  • Component add(Component c),将一个给定的组件添加到该窗体的内容窗格中,并返回这个组件。

java.awt.Component 1.0

  • void repaint(),尽可能快的重新绘制组件
  • Dimension getPreferredSize(),覆盖这个方法,以返回这个组件的首选大小。

javax.swing.JComponent 1.2

  • void paintComponent(Graphics g),覆盖这个方法来描述需要如何绘制组件

java.awt.Window 1.0

  • void pack(),调整窗口大小,要考虑其组件的首选大小。
相关推荐
测试员周周13 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
kyriewen13 小时前
百度用6%成本碾压硅谷?中国AI把性价比玩明白了
前端·百度·ai编程
dfdfadffa13 小时前
如何用模块化方案组织一个可扩展的前端组件库项目
jvm·数据库·python
2301_8125396713 小时前
SQL中如何高效实现分组数据的批量更新_利用窗口函数与JOIN
jvm·数据库·python
kyriewen13 小时前
你还在手动敲命令部署?GitHub Actions 让你 push 即上线,摸鱼时间翻倍
前端·面试·github
RSTJ_162513 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
2501_9012005313 小时前
如何实现SQL存储过程存储过程参数标准化_统一命名规范
jvm·数据库·python
运气好好的14 小时前
Golang怎么用embed嵌入SQL文件_Golang如何将SQL迁移文件嵌入Go程序统一管理【技巧】
jvm·数据库·python
想学习java初学者14 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦14 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw