我遇到了一个非常大的问题,当我创建
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);
}
}
不要重写 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);
}
}
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)
;
查看仔细观察绘画机制
这一切都在 javadoc 中进行了解释:
公共空间油漆(图形g)
给容器上色。这会将绘制转发到该容器子级的任何轻量级组件。如果重新实现此方法,则应调用 super.paint(g) 以便正确渲染轻量级组件。
您不应该将
paint()
与 JFrame
一起使用,因为最好在 paintComponent()
上使用 JPanel
,然后将其添加到 JFrame
。
在
paintComponent()
中调用super.paintComponent()
来准备要绘制的绘图表面。