Java 我的形状上没有显示J组件?

Java 我的形状上没有显示J组件?,java,swing,user-interface,jbutton,jlabel,Java,Swing,User Interface,Jbutton,Jlabel,我遇到了一个非常大的问题,当我创建一个JLabel、Jbutton等等…它可以在屏幕上显示,但是当我想把它们放在一个矩形上时,它消失了,而这个矩形只显示出来 使用JLabel时,我选择使用drawstring,但现在我不得不尝试使用JTextField。我不知道我错过了什么 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.lang.*; import javax.swing.event.*

我遇到了一个非常大的问题,当我创建一个JLabel、Jbutton等等…它可以在屏幕上显示,但是当我想把它们放在一个矩形上时,它消失了,而这个矩形只显示出来

使用JLabel时,我选择使用drawstring,但现在我不得不尝试使用JTextField。我不知道我错过了什么

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import javax.swing.event.*;

class main
{   
    public static void main (String Args [])
    {
        GUIwindow guiW = new GUIwindow();
    }
}

class GUIwindow extends JFrame
{
    JPanel grid = new JPanel();
    JTextArea screenArea = new JTextArea("", 10, 20);
    JScrollPane scrollBar = new JScrollPane(screenArea);

    GUIwindow()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500,800);
        setTitle("Title here");
        setLocationRelativeTo(null);

        screenArea.setLineWrap(true);
        screenArea.setEditable(false);


        grid.add(scrollBar);
        add(grid);
        setVisible(true);
    }

    public void paint (Graphics g)
    {
        g.setColor(Color.decode("#0232ac"));
        g.fillRoundRect(100, 50, 300, 600, 50, 50);
        g.setColor(Color.white);
        g.drawString("TitleonRect", 220, 80);
    }  

}

不要重写JFrame的方法
paint()

重写元素的方法
paintComponent()

如果将JPanel子类化,则可以重写其
paintComponent
方法:

class GridPanel extends JPanel {
    GridPanel() {
        super();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.decode("#0232ac"));
        g.fillRoundRect(100, 50, 300, 600, 50, 50);
        g.setColor(Color.white);
        g.drawString("TitleonRect", 220, 80);
    }
}
这一切都在以下章节中解释:

公共空间涂料(图g)

油漆容器。这会将油漆转发到此容器的子级的任何轻型组件。如果重新实现此方法,则应调用super.paint(g),以便正确渲染轻量级组件


您不应该将
paint()
JFrame
一起使用,因为最好在
JPanel
上使用
paintComponent()
,然后将其添加到
JFrame

paintComponent()
中,调用
super.paintComponent()
来准备要绘制的绘图面。

函数是绘制组件的函数,它满足于按显示顺序调用以下三个函数:

  • 受保护的void paintComponent(图形g)
    :这一个用于绘制组件,例如:背景
  • 受保护的void paintBorder(图形g)
    :该图形绘制组件的边框
  • 受保护的void paintChildren(图形g)
    :该图形绘制其中组件的子级
因此,通过重写
paint(Graphics g)
函数来绘制的任何内容,都应该按照它们在
paint()函数中出现的顺序调用这些函数。调用
super.paint(g)
将起作用,因为它正在调用容器的超类(
JComponent
class)
paint()
函数,该函数已经在调用这三个函数

但是:为什么要覆盖这个
paint()
函数来进行自定义绘制呢!通过创建扩展
JComponent或JPanel的自定义组件来放置自定义绘制代码,并通过重写来实现
paintComponent()
函数,不要忘记调用
super.paintComponent()
。如果需要将此自定义组件作为框架的内容窗格:只需设置此窗格
frame.setContentPane(customPane)


签出

是,因为您的代码片段只添加了一个文本框,您还希望它显示什么?JFrame没有paintComponent()方法。您应该创建一个JPanel,将组件添加到此面板,并重写面板的paintComponent()方法。并将此面板添加到框架中。另外,始终将@Override注释添加到应该重写基类/接口中的方法的方法中。如果更改字符串的坐标,则会出现该注释。你明白了,现在你的工作就是使用它来了解它如何满足你的需要。@jbnize这不是我所做的吗?@Bobski将字符串的坐标更改为220 400,你会看到:)