因此,基本上,当我添加一个按钮时,它实际上会将该程序中绘制的黑色矩形向下推,将其移出给定位置。您将如何解决?
import javax.swing.*;
import java.awt.*;
public class Grid {
public class homeGraphics extends JComponent {
homeGraphics() {
setPreferredSize(new Dimension(450, 600));
}
public void paint(Graphics g) {
super.paint(g);
g.fillRect(200, 275, 50, 50);
}
}
public void homeFrame() {
JFrame frame1 = new JFrame();
frame1.setSize(450, 600);
frame1.setResizable(false);
frame1.setDefaultCloseOperation(frame1.EXIT_ON_CLOSE);
JButton playButton = new JButton("Play");
playButton.setPreferredSize(new Dimension(60, 30));
JPanel panel1 = new JPanel();
panel1.add(playButton);
panel1.add(new homeGraphics());
frame1.add(panel1);
frame1.setVisible(true);
}
public static void main(String args[]) {
Grid frame = new Grid();
frame.homeFrame();
}
}```
实质上是将程序中绘制的黑色矩形向下推,将其移出给定位置。
您是什么意思?绘制总是相对于组件完成的。因此,您的绘画将始终在组件的(200,275)处完成。
如果您要相对于“框架”以(200,275)进行绘制,则不要。那不是绘画的原理。
您的代码的其他问题:
请勿尝试设置相框的尺寸。如果自定义面板是(450,600),框架怎么可能是相同大小?框架还包含“标题栏”和“边框”。而不使用setSize(),而是调用frame
.pack()just before
frame1.setVisible(…。)`。
类名以大写字母开头。通过例子学习。您是否曾经在JDK中看到过不以大写字母开头的类名?
自定义绘画是通过重写paintComponent(…)
,而不是paint()。
默认情况下,JPanel使用FlowLayout。因此,您看到的是一行上的按钮,然后“ HomeGraphics”类太大而无法容纳在同一行上,因此将其包装到第二行。
进行框架布局时,您应该更加明确。因此,您的代码应类似于:
JPanel wrapper = new JPanel();
wrapper.add( playButton );
//JPanel panel1 = new JPanel();
//panel1.add(playButton);
//panel1.add(new homeGraphics());
JPanel panel1 = new JPanel( new BorderLayout() );
panel1.add(wrapper, BorderLayout.PAGE_START);
panel1.add(new HomeGraphics(), BorderLayout.CENTER);
现在,代码可以更清楚地显示您的布局尝试。