如何使按钮不干扰绘制形状的位置?

问题描述 投票:0回答:1

因此,基本上,当我添加一个按钮时,它实际上会将该程序中绘制的黑色矩形向下推,将其移出给定位置。您将如何解决?

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();
    }
}```
java swing jframe jpanel
1个回答
0
投票

实质上是将程序中绘制的黑色矩形向下推,将其移出给定位置。

您是什么意思?绘制总是相对于组件完成的。因此,您的绘画将始终在组件的(200,275)处完成。

如果您要相对于“框架”以(200,275)进行绘制,则不要。那不是绘画的原理。

您的代码的其他问题:

  1. 请勿尝试设置相框的尺寸。如果自定义面板是(450,600),框架怎么可能是相同大小?框架还包含“标题栏”和“边框”。而不使用setSize(),而是调用frame .pack()just before frame1.setVisible(…。)`。

  2. 类名以大写字母开头。通过例子学习。您是否曾经在JDK中看到过不以大写字母开头的类名?

  3. 自定义绘画是通过重写paintComponent(…),而不是paint()。

  4. 默认情况下,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);

现在,代码可以更清楚地显示您的布局尝试。

© www.soinside.com 2019 - 2024. All rights reserved.