gpt4 book ai didi

java - 使用 Java 创建自定义 UI 元素

转载 作者:行者123 更新时间:2023-12-01 18:41:04 26 4
gpt4 key购买 nike

我想在 JFrame 上绘制自定义元素。

我通过创建一个 UI 类(扩展 JFrame)和一个 Component 类(扩展 JPanel)进行了尝试。该组件在其自身上绘制一些内容,并且 UI 只是添加该组件。所以到目前为止,我已经编写了这段代码:

文件 UI.java

package UIComponent;

import javax.swing.JFrame;

public class UI extends JFrame {

public UI(){
this.setSize(1024,684);
this.setTitle("This is just a test program.");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.add(new Component(20,20,20,20));
this.add(new Component(40,30,20,20));
}

}

文件Component.java

package UIComponent;

import java.awt.Color;
import javax.swing.JPanel;
import java.awt.Graphics;

public class Component extends JPanel {

int x, y, w, h;

public Component(int x, int y, int w, int h){
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}

@Override
public void paintComponent(Graphics g){
g.setColor(Color.red);
g.fillRect(this.x, this.y, this.w, this.h);
}

}

但是结果并不是我所接受的。它只绘制一个矩形。

最佳答案

x/y/w/h 值与组件的实际大小无关,可能为 0x0,这意味着您将在组件的可见区域之外进行绘制。

首先重写 getPreferredSize 方法并返回一个允许您绘画可见的区域,例如......

public Dimension getPreferredSize() {
return new Dimension(x + w, y + h);
}

例如。

JFrame 默认使用 BorderLayout,这意味着它只允许一个组件在其 5 个可用位置中的任意位置可见。

这意味着您的示例将仅显示最后添加的组件。

根据您想要实现的目标,您可能会考虑使用 OverlayLayout 或其他布局管理器。

就我个人而言,除非您有特殊需要,否则我不会担心绘画的 x/y 位置,而只需从组件的 0x0 位置开始绘画,从而允许容器布局管理器处理实际的定位。

我会重新考虑您的一些命名,因为 Component 已经存在于 API 中,可能会引起困惑,并且组件已经有了位置和大小的概念......

请记住,组件在其容器内的位置对于组件绘制的开始位置没有影响。也就是说,0x0 始终是组件的左上角。

关于java - 使用 Java 创建自定义 UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19963165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com