我的形状上没有J组件?

时间:2013-11-10 12:39:52

标签: java swing user-interface jbutton jlabel

我有一个非常大的问题,其中当我创建一个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 个答案:

答案 0 :(得分:1)

不要覆盖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);
    }
}

答案 1 :(得分: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);

查看A Closer Look at the Paint Mechanism

答案 2 :(得分:0)

所有这些都在the javadoc中解释:

  

public void paint(Graphics g)

     

涂抹容器。这会将paint转发给任何属于此容器子级的轻量级组件。如果重新实现此方法,则应调用super.paint(g)以便正确呈现轻量级组件。

答案 3 :(得分:0)

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

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