为什么我的矩形在 java 图形 2d 中这么小
Why my rectangle shape is so small in java graphics 2d
所以我是 java 图形方面的新手,我正在创建一个显示矩形的程序。但是当我 运行 我的程序时,它只显示像一个小盒子而不是矩形。我真的不知道为什么会这样。
这是我的代码:
import javax.swing.*;
public class GraphicsEditor{
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
Rectangle rectangle = new Rectangle();
frame.setSize(1280, 720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(panel);
panel.add(rectangle);
}
}
这是我的矩形 class:
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Rectangle extends JPanel implements Shape {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.fillRect(0, 0, 200, 130);
}
}
这是我的形状界面:
import java.awt.*;
public interface Shape {
void paintComponent(Graphics g);
}
在这里,试试这个
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class GraphicsEditor {
public static void main(String[] args) {
JFrame frame = new JFrame();
Rectangle rectangle = new Rectangle();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(rectangle);
frame.pack();
// center frame on screen
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class Rectangle extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.fillRect(0, 0, 200, 130);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}
几件事。
- 您不需要界面。
- 与组件不同,仅绘制图片不会影响布局管理器,因此面板将缩小到默认大小,而不考虑任何绘制。
- 因此您需要在 JPanel 中覆盖
getPreferredSize()
。
正如评论所说,您应该将 panel
和 rectangle
的首选大小设置为您想要的大小,然后打包框架,如:
panel.setPreferredSize(new Dimension(500,500));
rectangle.setPreferredSize(new Dimension(500,500));
frame.pack();
否则您的 LayoutManager(未指定时默认为 FlowLayout
)将按其需要的方式处理您的矩形。所以另一种方法是学习 Layout Managers,并使用你想要的。
作为旁注,我想对您的代码提出一些建议。请记住,,因此请将您的代码放在 invokeLater()
调用中,例如:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
Rectangle rectangle = new Rectangle();
frame.setSize(1280, 720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setPreferredSize(new Dimension(500,500));
rectangle.setPreferredSize(new Dimension(500,500));
frame.add(panel);
panel.add(rectangle);
frame.pack();
frame.setVisible(true);
}
});
此外,调用 frame.setVisible(true)
应该在添加组件后调用。
所以我是 java 图形方面的新手,我正在创建一个显示矩形的程序。但是当我 运行 我的程序时,它只显示像一个小盒子而不是矩形。我真的不知道为什么会这样。
这是我的代码:
import javax.swing.*;
public class GraphicsEditor{
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
Rectangle rectangle = new Rectangle();
frame.setSize(1280, 720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(panel);
panel.add(rectangle);
}
}
这是我的矩形 class:
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;
public class Rectangle extends JPanel implements Shape {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.fillRect(0, 0, 200, 130);
}
}
这是我的形状界面:
import java.awt.*;
public interface Shape {
void paintComponent(Graphics g);
}
在这里,试试这个
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.LineBorder;
public class GraphicsEditor {
public static void main(String[] args) {
JFrame frame = new JFrame();
Rectangle rectangle = new Rectangle();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(rectangle);
frame.pack();
// center frame on screen
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class Rectangle extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
g2D.fillRect(0, 0, 200, 130);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}
}
几件事。
- 您不需要界面。
- 与组件不同,仅绘制图片不会影响布局管理器,因此面板将缩小到默认大小,而不考虑任何绘制。
- 因此您需要在 JPanel 中覆盖
getPreferredSize()
。
正如评论所说,您应该将 panel
和 rectangle
的首选大小设置为您想要的大小,然后打包框架,如:
panel.setPreferredSize(new Dimension(500,500));
rectangle.setPreferredSize(new Dimension(500,500));
frame.pack();
否则您的 LayoutManager(未指定时默认为 FlowLayout
)将按其需要的方式处理您的矩形。所以另一种方法是学习 Layout Managers,并使用你想要的。
作为旁注,我想对您的代码提出一些建议。请记住,invokeLater()
调用中,例如:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
Rectangle rectangle = new Rectangle();
frame.setSize(1280, 720);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setPreferredSize(new Dimension(500,500));
rectangle.setPreferredSize(new Dimension(500,500));
frame.add(panel);
panel.add(rectangle);
frame.pack();
frame.setVisible(true);
}
});
此外,调用 frame.setVisible(true)
应该在添加组件后调用。