- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 PaintComponent 绘制形状时遇到不清楚的问题。
public class Shape extends JPanel {
private String shape;
private boolean isFill;
private int x;
private int y;
private int width;
private int height;
private Color color;
public Shape(String shape, boolean isFill, int x, int y, int width, int height, Color color) {
this.shape = shape;
this.isFill = isFill;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.color = color;
}
@Override
public boolean equals (Object O){
if (O instanceof Shape){
if (this.getWidth() == ((Shape) O).getWidth() && this.getHeight() == ((Shape) O).getHeight()){
return true;
}
}
return false;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(this.getColor());
if (this.getShape().equals(Constants.IS_RECTANGLE)){
if (this.isFill()){
g.fillRect(this.getX(), this.getY(),this.getWidth(),this.getHeight());
}
else{
g.drawRect(this.getX(), this.getY(),this.getWidth(),this.getHeight());
}
}
else{
if (this.isFill()){
g.fillOval(this.getX(), this.getY(),this.getWidth(),this.getHeight());
}
else{
g.drawOval(this.getX(), this.getY(),this.getWidth(),this.getHeight());
}
}
}
public void drawShape(JPanel panel){
panel.add(this);
panel.setVisible(true);
}
这是我的 Shape 类,我想将一些添加到面板中(使用 JPanel)。
public class GuiManagement {
public JFrame createScreen(){
// Creating the screen
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle(Constants.APP_NAME);
frame.setSize(Constants.SCREEN_WIDTH,Constants.SCREEN_HEIGHT);
return frame;
}
public JPanel createPanel(JFrame frame, int x, int y, int width, int height, String borderSpace){
// Creates a panel, set its bounds and direction in the screen
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(x,y,width,height);
frame.add(panel, borderSpace);
panel.setVisible(true);
return panel;
}
这些是我创建并返回框架和面板的两个函数。
public static void main (String [] args){
GuiManagement g = new GuiManagement();
JFrame frame = g.createScreen();
JPanel panel = g.createPanel(frame,0,0,800,800,BorderLayout.NORTH);
panel.setBackground(Color.GREEN);
Shape s = new Shape("Oval",true,40,40,100,100,Color.DARK_GRAY);
s.drawShape(panel);
frame.setLayout(new BorderLayout(30,30));
frame.setVisible(true);
}
这就是主类。现在,程序应该绘制一个简单的椭圆形,但是当我运行主函数时,看起来面板分配了正确的空间来绘制形状(框架的绿色部分是我创建的面板),但绘制了它仅在该空间的一小部分。我在下图中添加了问题的示例。 PRINT SCREEN EXAMPLE OF THE PROBLEM HERE!!!
感谢您的帮助! :)
最佳答案
因此,您遇到了一系列复杂的问题,并且对 Swing 中坐标系统的工作原理存在根本性误解。
正在做...
g.fillRect(this.getX(), this.getY(),this.getWidth(),this.getHeight());
这是一个坏主意。
getX
和 getY
表示组件在其父组件空间内的位置,因此您现在已将绘图位置偏移了 x * 2
和 y * 2
I renamed the getX and getY functions
好吧,这不在你的原始代码中,它只会导致更多困惑
所以,我使用...设置了一个小测试
Shape shape = new Shape("", true, 25, 25, 50, 50, Color.RED);
shape.setBorder(new LineBorder(Color.BLUE));
shape.setBounds(25, 25, 50, 50);
(我修改了形状
以始终绘制椭圆形),这会产生...
您可以看到形状现在在 Shape
组件内发生偏移。
相反,您应该从 0x0
开始绘制,这将是 Shape
组件的左上角/左上角。
我修改了 Shape
代码以使用...
if (this.isFill()) {
g.fillOval(0, 0, this.getWidth(), this.getHeight());
} else {
g.drawOval(0, 0, this.getWidth(), this.getHeight());
}
现在它生成...
恕我直言,以这种方式使用组件是一个坏主意。 null
布局是出了名的难以管理,如果您只想绘制形状,那么纯自定义绘制路线通常更好/更容易管理。
这个想法基本上构建了一个可以绘制任意数量的“形状”对象的单个组件
因为我喜欢从一个可以构建的“抽象”概念开始,所以我从 Shape
的基本概念开始,它定义了所有 Shape< 的所有信息
实现需要...
public interface Shape {
public Rectangle getBounds();
public boolean isFilled();
public Color getColor();
public void paint(Graphics2D g2d);
}
然后我定义一个抽象
实现,它涵盖了核心/通用功能......
public abstract class AbstractShape implements Shape {
private Rectangle bounds;
private boolean filled;
private Color color;
public AbstractShape(Rectangle bounds, boolean filled, Color color) {
this.bounds = bounds;
this.filled = filled;
this.color = color;
}
public Rectangle getBounds() {
return bounds;
}
public boolean isFilled() {
return filled;
}
public Color getColor() {
return color;
}
}
然后我定义实际的实现,在本例中,我只完成了 OvalShape
,但您可以有三角形、矩形、弧形和上方形状...
public class OvalShape extends AbstractShape {
public OvalShape(Rectangle bounds, boolean filled, Color color) {
super(bounds, filled, color);
}
@Override
public void paint(Graphics2D g2d) {
g2d.setColor(this.getColor());
Rectangle bounds = getBounds();
if (isFilled()) {
g2d.fillOval(bounds.x, bounds.y, bounds.width, bounds.height);
} else {
g2d.drawOval(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
}
然后,我们需要某种方法来显示这些形状......
public class ShapeContainer extends JPanel {
private List<Shape> shapes;
public ShapeContainer() {
shapes = new ArrayList<>(25);
}
public void add(Shape shape) {
shapes.add(shape);
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Shape shape : shapes) {
Graphics2D g2d = (Graphics2D) g.create();
shape.paint(g2d);
g2d.dispose();
}
}
}
这意味着,所有形状都在容器坐标上下文中工作,如果您想在轨道上添加新功能,则无需担心尝试翻译它们...
因为我知道这可能有点需要接受,一个可运行的例子......
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
Shape shape = new OvalShape(new Rectangle(25, 24, 50, 50), true, Color.RED);
ShapeContainer container = new ShapeContainer();
container.add(shape);
frame.add(container);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public interface Shape {
public Rectangle getBounds();
public boolean isFilled();
public Color getColor();
public void paint(Graphics2D g2d);
}
public abstract class AbstractShape implements Shape {
private Rectangle bounds;
private boolean filled;
private Color color;
public AbstractShape(Rectangle bounds, boolean filled, Color color) {
this.bounds = bounds;
this.filled = filled;
this.color = color;
}
public Rectangle getBounds() {
return bounds;
}
public boolean isFilled() {
return filled;
}
public Color getColor() {
return color;
}
}
public class OvalShape extends AbstractShape {
public OvalShape(Rectangle bounds, boolean filled, Color color) {
super(bounds, filled, color);
}
@Override
public void paint(Graphics2D g2d) {
g2d.setColor(this.getColor());
Rectangle bounds = getBounds();
if (isFilled()) {
g2d.fillOval(bounds.x, bounds.y, bounds.width, bounds.height);
} else {
g2d.drawOval(bounds.x, bounds.y, bounds.width, bounds.height);
}
}
}
public class ShapeContainer extends JPanel {
private List<Shape> shapes;
public ShapeContainer() {
shapes = new ArrayList<>(25);
}
public void add(Shape shape) {
shapes.add(shape);
repaint();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (Shape shape : shapes) {
Graphics2D g2d = (Graphics2D) g.create();
shape.paint(g2d);
g2d.dispose();
}
}
}
}
关于java - PaintComponent 的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47914227/
我是 Java 的新手。下面是两个类,一个类扩展JComponent,需要重写paintComponent方法。另一个类扩展了JPanel,同样需要重写paintComponent方法。 为什么Dra
我想知道 paintcomponent() 和 paintcomponents() 有什么不同? 当我从 paintcomponent 使用它时,它显示了我们想要的一切,但是 paintcompone
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Gr
我稍后在我的主方法中使用这样的调用: public static void main(String[] args) { SwingUtilities.invokeLater(new Runna
所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个空间上绘制一个对象。我发现绘制对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。 详
这个问题已经有答案了: paintComponent is not being called in JPanel (1 个回答) 已关闭 4 年前。 很抱歉,这个问题可能已经解决了,但我已经到处搜索但
我的问题非常简单:我有这个小程序,它只是没有显示我正在尝试制作的红框: 主要 public class Main { public static void main(String[] args
我正在尝试编写一个类似这样的应用程序: - 显示对话框 - 当用户单击“确定”时,关闭对话框,转到主应用程序 以下是相关代码片段: public class Owari extends JPanel
这应该是一个抽象类,可以扩展以绘制连接 JPanel 上某些坐标点的线。 但是,永远不会调用专门的 PaintComponents() 方法。我已经看到其他答案并尝试使用他们的解决方案,例如检查我是否
我有以下结构: method1 method2 ... methodn methodX 方法x包含: JFrame frame = new JFrame("Sample"); frame.setDef
我在使用矩形时遇到一些问题 这是我的代码: import java.awt.*; import javax.swing.*; import java.util.*; public class squa
我正在尝试制作西洋跳棋游戏,但以下架构没有在 JFrame 上显示我做错了什么 //基类 import java.awt.event.MouseEvent; import java.awt.event
问题涉及我项目中的 2 个类:主类和绘图类。主类创建 JFrame 并在其中放置 2 个 JPanel。第一个 JPanel 包含用于输入数字的 JTextFields 和用于选择不同选项的 JBut
我已经处理学校作业有一段时间了。但我无法真正理解我应该做什么。作业明天就要交了,我感觉压力很大。 任务是,我将获取一些图片,将它们放在窗口中,然后能够在它们周围移动并能够旋转。 最大的问题是我不知道如
我在使用 PaintComponent 绘制形状时遇到不清楚的问题。 public class Shape extends JPanel { private String shape; private
据我了解,Swing 将决定何时需要重新绘制,这可以解释为什么 paintComponent() 执行两次。但我制作了一个 hibernate 16 毫秒、重绘、 hibernate 16 毫秒、重绘
这是我的代码,它工作完美,并在 JFrame 中绘制形状。每个方法都通过其名称进行调用,在我的程序中我没有调用任何 paintComponent() 方法。那么paintComponent()方法的调
我正在尝试在 JPanel 上绘制一些内容,但似乎我遇到了 paint 和 paintComponent 方法的问题。可能与双缓冲有关,但我不确定。 public void PaintComponen
我是 Swing 新手,正在尝试将图像背景添加到我的 JFrame 中。但是我的 paintComponent 方法不起作用。您能否就如何修复我的代码以便在背景中绘制图像提供一些建议? 代码如下: /
我正在尝试编写简单的程序,当鼠标拖动时绘制圆圈,但paintComponent方法仅被调用一次(启动后)。 在这个类中,我有一些在拖动鼠标时绘制圆圈的方法。 import javax.swing.*;
我是一名优秀的程序员,十分优秀!