1

我遇到了一个非常大的问题,当我创建一个 JLabel、Jbutton 等时,它可以在屏幕上显示,但是当我想将它们放在一个矩形上时,它会消失并且矩形只显示?

使用 JLabel 我选择使用拉绳,但现在我坚持尝试打开 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);
    }  

}
4

4 回答 4

1

不要覆盖paint()JFrame 的方法。

覆盖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);
    }
}
于 2013-11-10T12:44:20.670 回答
1

paint(Graphics g)函数是绘制组件的函数,它满足于按照它们出现的顺序调用以下三个函数:

  • protected void paintComponent(Graphics g):这个画你的组件,例如:背景
  • protected void paintBorder(Graphics g):这个绘制组件的边框
  • protected void paintChildren(Graphics g):这个在其中绘制组件的子项

所以,你通过重写函数绘制的任何东西paint(Graphics g),你都应该按照它们在函数内部出现的顺序调用这些paint()函数。调用super.paint(g)将起作用,因为它正在调用容器的超类(JComponent类)的paint()函数,该函数已经在调用这三个函数。

paint()但是:为什么你只是为了自定义绘画而覆盖这个功能!通过创建自定义组件来放置您的自定义绘画代码,并通过覆盖它来JComponent or JPanel实现paintComponent()功能,并且不要忘记调用super.paintComponent(). 如果您需要将此自定义组件作为框架的内容窗格:只需设置此窗格frame.setContentPane(customPane)

仔细看看油漆机制

于 2013-11-10T12:52:39.897 回答
0

这一切都在javadoc中进行了解释:

公共无效油漆(图形g)

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

于 2013-11-10T12:46:06.263 回答
0

您不应该使用paint()with ,JFrame因为最好使用paintComponent()onJPanel然后将其添加到JFrame.

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

于 2013-11-10T12:46:42.173 回答