我试图在 JFrame 上绘制一个普通的蓝色矩形,当我按下播放按钮时根本没有出现任何窗口(没有蓝色矩形)
我知道网上有教程展示如何在 JFrame 上绘制矩形,但我想知道以下代码的问题以及为什么它不起作用。
public class Window extends JFrame {
public Window() {
initialize();
}
private void initialize() {
JFrame frame = new JFrame();
frame.setBounds(100, 100, 600, 600);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
frame.getContentPane().add(new Display());
}
public static void main(String[]args) {
Window window = new Window();
}
}
public class Display extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
public void reDraw() {
repaint();
}
}
总的来说,我想知道上面代码的问题以及如何修复它,以便在播放程序时在窗口上绘制蓝色矩形。 感谢您的阅读:)
最佳答案
您的主要问题是:
frame.getContentPane().setLayout(null);
- 这通常是一个坏主意。这种方法存在很多问题,很难一一列举。null
布局要求您对容器的子容器的位置和大小承担全部责任。他们没有考虑不同的平台渲染系统和特征- 您会发现很难准确调整父窗口的大小,因为可用内容大小是框架大小减去框架边框,因此当您将框架设置为 600x600 时,实际可用内容空间将为较小
- 组件的默认大小和位置是
0x0
- 因此,除非您愿意控制它(这就是布局管理器所做的),否则它永远不会显示(Swing 并不愚蠢,但它很懒;))
- 未在
JFrame
上调用setVisible
- 未为
显示
面板提供尺寸调整提示 - 扩展
JFrame
...并且不使用它。通常不鼓励扩展JFrame
,但在您的情况下,它只是添加不需要的噪音
工作示例
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {//extends JFrame {
public Test() {
initialize();
}
private void initialize() {
JFrame frame = new JFrame();
//frame.setBounds(100, 100, 600, 600);
//frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.getContentPane().setLayout(null);
frame.getContentPane().add(new Display());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
Test window = new Test();
}
public class Display extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 600);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(0, 0, 100, 100);
}
// Not sure what benefit this provides
//public void reDraw() {
// repaint();
//}
}
}
您可能想看看Laying Out Components Within a Container更好地了解布局管理器及其功能和工作原理(以及为什么应该使用它们;))
关于java - 图形未出现在窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682153/