Java 如何在一个框架中添加图形(绘制方法)和另一个带有控件的面板?

Java 如何在一个框架中添加图形(绘制方法)和另一个带有控件的面板?,java,swing,Java,Swing,我需要一个JFrame,其中上部是由paint()绘制的图形,下部是由JLabel、JTextField和JButton组件组成的面板 这可能吗?我该怎么做?对于绘制部分,创建一个JPanel(或其他可绘制组件)并覆盖绘制方法。使用第二个JPanel并将所有其他组件放在其中 从那里,查看如何在 最简单的方法是使用GridLayout,上半部分是涂漆面板,下半部分是组件面板 我需要一个Jframe,其中上部是由paint()绘制的图形,下部是由JLabel、JTextField和JButtons组

我需要一个
JFrame
,其中上部是由paint()绘制的图形,下部是由
JLabel
JTextField
JButton
组件组成的面板


这可能吗?我该怎么做?

对于绘制部分,创建一个JPanel(或其他可绘制组件)并覆盖绘制方法。使用第二个JPanel并将所有其他组件放在其中

从那里,查看如何在

最简单的方法是使用GridLayout,上半部分是涂漆面板,下半部分是组件面板

我需要一个Jframe,其中上部是由paint()绘制的图形,下部是由JLabel、JTextField和JButtons组成的面板

在你想做的事情上没有冲突。您可以有一个带有2个子面板的主JPanel。一个在顶部用于图形,另一个在底部用于包含JC组件,如JButtons:

代码中的结构可能如下所示:

class MainPanel extends JPanel{
    private DrawingSpace drawingSpace;  //Customized JPanel for drawing
    private JPanel subPanel;

    public MainPanel(){
        setPreferredSize(new Dimension(400, 400));
        initComponents();
    }

    private void initComponents(){
        drawingSpace = new DrawingSpace();
        subPanel = new JPanel();
    }
}
您可以按如下方式定制JPanel(这是可选的):

在实现了
JPanels
之后,您只需将
MainPanel
的一个实例添加到
JFrame

JFrame frame = new JFrame();
frame.add(new MainPanel());
//Other codes for JFrame not shown here

用户3437460建议的解决方案(上部使用JPanel,并覆盖JPanel中的绘制方法)是解决此问题的首选方法

但是,当您要求直接喷涂上部的解决方案时(不建议这样做,但有解决方案):

  • 这个问题的一个(讨厌的)解决方法是覆盖JFrame的必要绘制方法,绘制上部,将图形上下文转换大约100个像素,并调用继承的绘制方法来绘制底部。(请注意,您将遇到布局管理器问题,因为布局管理器看不到上部的100px高度。但是,如果您使用的是绝对布局,它可能会工作。Hacks,Hacks Hacks:(

  • 另一个超级技巧是将下半部分做得足够大(如果使用绝对布局,则将下半部分放置在y=100px),然后添加自己的GlassPane,并在GlassPane上呈现上半部分(或任何地方)的内容

  • 当然,您可以创建一个专用的布局管理器,使顶部100像素的部分为空。使用该布局管理器,然后您可以在顶部获得一些空白空间,您可以在上面绘制

我想现在你可以同意问题是“如何在窗口顶部放置自定义绘制的组件”,这可以通过在窗口顶部放置自定义绘制的JPanel来解决。保持轻松!和平


ps:override paintComponent()而不是JPanel的paint()。请参见

的底部,你的意思是在按钮和其他字段上绘制吗?如果可能的话,我会尝试覆盖面板(你只能在上面绘制),并给它们一个透明的背景。更重要的是:北部是paint(),南部是按钮和文本字段。“更重要的是:北部是paint()……”鉴于在Swing组件中可以轻松缩放自定义绘制的渲染,我建议将自定义绘制的组件放置在
边界布局的
中心
,并使用
页面末端的控件
(南)。
绘制由paint()制作的图形
-不应该这样。自定义绘制是通过覆盖
paintComponent(…)
来完成的。有关更多信息和工作示例,请阅读Swing教程中的部分。“您可以拥有一个带有2个子面板的主JPanel。“是的。这是大多数GUI的构建方式。它还允许我们使用布局管理器对GUI的该部分(面板)最有效的方式。下面是一个例子。
JFrame frame = new JFrame();
frame.add(new MainPanel());
//Other codes for JFrame not shown here