为什么组件没有显示在我的形状上。我想把它们放在一个矩形上,它消失了,矩形只显示了?

问题描述 投票:0回答:4

我遇到了一个非常大的问题,当我创建

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);
    }  
    
}
java swing user-interface jbutton jlabel
4个回答
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
投票

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)
;

查看仔细观察绘画机制


0
投票

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

公共空间油漆(图形g)

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


0
投票

您不应该将

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

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

© www.soinside.com 2019 - 2024. All rights reserved.