如何在一个框架内添加一个GUI面板和一个DrawPanel?

How to add a GUI panel and a DrawPanel within one frame?

我想在一帧内在此处添加两个面板,我想要右侧的一些按钮和文本字段来编辑绘图面板class但我不知道如何添加 GUI panel2 的组成部分。每当我尝试向 panel2 添加 GUI 组件时,它就无法正常工作,我不明白为什么。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setTitle("WaferMap");
        frame.setSize(1286, 829);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);
        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        DrawingPanel panel1 = new DrawingPanel();
        JPanel panel2 = new JPanel();

        frame.add(panel1, BorderLayout.WEST);
        panel1.setPreferredSize(new Dimension(1080, 800));

        final JButton button = new JButton();

        panel2.add(button, BorderLayout.EAST);
        button.setBounds(50,50,100,50);
        frame.add(panel2, BorderLayout.EAST);
        panel2.setPreferredSize(new Dimension(200, 800));
    }
}

这是主要的,我还有一个叫 drawingPanel 的 class,里面有一个 paintComponent

  1. 不要使用 setPreferredSize()。布局管理器的工作是根据布局管理器的规则和添加到面板的组件的首选尺寸来计算面板的首选尺寸。

  2. 不要使用 setSize()。而是使用 pack()。将根据添加到框架的所有组件的首选大小调整框架的大小。

  3. 真正的问题是,默认情况下,组件的大小为 (0. 0),因此没有可绘制的内容。给组件一个 size/location 是布局管理器的工作。问题是您在将组件添加到面板之前使框架可见,因此从未调用布局管理器。所以解决方案是 pack()setVisible(true) 语句应该在所有组件都添加到框架后调用。

请注意,本教程还有一个关于 Custom Painting 的部分,您应该阅读该部分,以便正确实施绘画以确保您的 DrawingPanel 具有首选尺寸。