为什么画不出椭圆?
Why oval can't be drawn?
我正在尝试理解 Paint Graphics,但我的椭圆无法绘制。有人能告诉我我做错了什么,椭圆形不是画的吗?
我哪里弄错了?
主要class:
import java.awt.EventQueue;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Frame frame = new Frame();
}
});
}
帧class:
public class Frame extends JFrame {
private static final long serialVersionUID = 1L;
public static Grafika grafika;
public Frame() {
JFrame frame = new JFrame("Title");
grafika = new Grafika();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(null);
// frame.addKeyListener(this);
frame.add(grafika);
}
}
最后一个图形 class:
public class Grafika extends JComponent {
int x = 200;
int y = 200;
public void paint(Graphics g) {
Graphics2D oval = (Graphics2D) g;
oval.setColor(Color.BLACK);
oval.fillOval(x, y, 100, 100);
oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
}
有几个问题,但最大的问题是您在 JFrame 上使用了空布局,然后添加了一个 JComponent,其首选大小和大小均为 0,0。因此,当您将 Grafika 添加到 JFrame 时,它没有机会显示。
建议:
- 切勿使用
null
布局,除非在非常特殊的特殊情况下。
- 为您的 Grafika 组件提供首选大小,最好通过覆盖
getPreferredSize()
,但在这个阶段,我认为可以在其上调用 setPreferredSize(...)
。
- 将其添加到 JFrame,
pack()
JFrame,最后,只有在所有组件都添加到 JFrame 后,才使其可见。
还有
- 您应该覆盖 paintComponent 而不是 paint
- 您应该在覆盖中调用超级绘画方法。
- 当您认为您正在覆盖父方法时,始终使用
@Override
注释。你可能错了,你希望编译器告诉你。
- 在绘图之前设置渲染提示。否则提示对绘图没有影响。
- 避免提供与核心 Java 类 名称冲突的 类 名称,例如
Frame
。这可能会让其他人和你未来的自己感到困惑。
例如,
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;
public class MyGrafika extends JComponent {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
private static final Color OVAL_COLOR = Color.RED;
private int ovalX = 200;
private int ovalY = 200;
private int ovalWidth = 100;
private int ovalHeight = 100;
public MyGrafika() {
setPreferredSize(new Dimension(PREF_W, PREF_H));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(OVAL_COLOR);
g2.fillOval(ovalX, ovalY, ovalWidth, ovalHeight);
}
private static void createAndShowGui() {
MyGrafika mainPanel = new MyGrafika();
JFrame frame = new JFrame("MyGrafika");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
由于您使用的是 Swing
,因此您应该覆盖 paintComponent
而不是 paint
,您还应该注意使用 null 布局。但关键是您应该在使框架可见之前添加 Grafika
组件:
frame.add(grafika);
frame.setVisible(true);
// frame.setLayout(null); REMOVE THIS!
如果你真的需要在框架可见后添加一个组件,那么你应该在框架或包含添加组件的面板上调用revalidate+repaint:
frame.setVisible(true);
// frame.setLayout(null); REMOVE THIS!
frame.add(grafika);
frame.validate();
frame.repaint();
我正在尝试理解 Paint Graphics,但我的椭圆无法绘制。有人能告诉我我做错了什么,椭圆形不是画的吗? 我哪里弄错了?
主要class:
import java.awt.EventQueue;
public class Main {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Frame frame = new Frame();
}
});
}
帧class:
public class Frame extends JFrame {
private static final long serialVersionUID = 1L;
public static Grafika grafika;
public Frame() {
JFrame frame = new JFrame("Title");
grafika = new Grafika();
frame.setSize(500, 500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLayout(null);
// frame.addKeyListener(this);
frame.add(grafika);
}
}
最后一个图形 class:
public class Grafika extends JComponent {
int x = 200;
int y = 200;
public void paint(Graphics g) {
Graphics2D oval = (Graphics2D) g;
oval.setColor(Color.BLACK);
oval.fillOval(x, y, 100, 100);
oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
}
有几个问题,但最大的问题是您在 JFrame 上使用了空布局,然后添加了一个 JComponent,其首选大小和大小均为 0,0。因此,当您将 Grafika 添加到 JFrame 时,它没有机会显示。
建议:
- 切勿使用
null
布局,除非在非常特殊的特殊情况下。 - 为您的 Grafika 组件提供首选大小,最好通过覆盖
getPreferredSize()
,但在这个阶段,我认为可以在其上调用setPreferredSize(...)
。 - 将其添加到 JFrame,
pack()
JFrame,最后,只有在所有组件都添加到 JFrame 后,才使其可见。
还有
- 您应该覆盖 paintComponent 而不是 paint
- 您应该在覆盖中调用超级绘画方法。
- 当您认为您正在覆盖父方法时,始终使用
@Override
注释。你可能错了,你希望编译器告诉你。 - 在绘图之前设置渲染提示。否则提示对绘图没有影响。
- 避免提供与核心 Java 类 名称冲突的 类 名称,例如
Frame
。这可能会让其他人和你未来的自己感到困惑。
例如,
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;
public class MyGrafika extends JComponent {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
private static final Color OVAL_COLOR = Color.RED;
private int ovalX = 200;
private int ovalY = 200;
private int ovalWidth = 100;
private int ovalHeight = 100;
public MyGrafika() {
setPreferredSize(new Dimension(PREF_W, PREF_H));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(OVAL_COLOR);
g2.fillOval(ovalX, ovalY, ovalWidth, ovalHeight);
}
private static void createAndShowGui() {
MyGrafika mainPanel = new MyGrafika();
JFrame frame = new JFrame("MyGrafika");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
由于您使用的是 Swing
,因此您应该覆盖 paintComponent
而不是 paint
,您还应该注意使用 null 布局。但关键是您应该在使框架可见之前添加 Grafika
组件:
frame.add(grafika);
frame.setVisible(true);
// frame.setLayout(null); REMOVE THIS!
如果你真的需要在框架可见后添加一个组件,那么你应该在框架或包含添加组件的面板上调用revalidate+repaint:
frame.setVisible(true);
// frame.setLayout(null); REMOVE THIS!
frame.add(grafika);
frame.validate();
frame.repaint();