Paint 组件在调整大小 window 或使用滚动条后消失
Paint component disappear after resizing window or use scrollbar
我编写了一个程序,在单击“确定”按钮后绘制 50 个矩形。但我不明白为什么它在调整 window 大小后消失,使用滚动条或再次单击“确定”。
这是我的代码(我有两个 类:drawingPanel 和 Main)
drawingPanel.java:
import javax.swing.*;
import java.awt.*;
public class drawingPanel extends JPanel
{
public boolean drawIt = false;
public int x = 140,y = 0;
public void paintIt()
{
drawIt = true;
repaint();
}
public void paintComponent(Graphics g)
{
if (drawIt == true)
{
super.paintComponent(g);
for (int i = 1; i <= 50; i++)
{
g.fillRect(x, y, 50, 50);
y += 70;
}
}
}
}
Main.java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame
{
private drawingPanel draw = new drawingPanel();
private JPanel controlPanel = new JPanel();
private JButton ok = new JButton("OK");
private JScrollPane scroll = new JScrollPane(draw);
public Main()
{
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Demo");
setLayout(new BorderLayout());
controlPanel.setLayout(new FlowLayout());
controlPanel.add(ok);
ok.addActionListener(new okListener());
draw.setPreferredSize(new Dimension(100,1000));
add(controlPanel, BorderLayout.NORTH);
add(scroll,BorderLayout.CENTER);
setVisible(true);
}
private class okListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
draw.paintIt();
}
}
public static void main(String[] args)
{
new Main();
}
}
请帮助我,在此先感谢。
像这样在您的绘制组件方法中重新初始化 x 和 y 字段,这样它们就不会在每次绘制 JPanel 时一直增加到看不见的地方:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // move this here
if (drawIt) {
x = 140; // add these guys
y = 0;
for (int i = 1; i <= 50; i++) {
// .... etc....
事情应该会顺利进行。
其他与您的问题无关的小问题:
- 应该始终调用 super 的绘制方法,因此将其从 if 块中拉出。
- 将绘图面板 class 重命名为
DrawingPanel
以使其符合 Java 约定。
- 最好把
if (drawIt == true) {
改成更简单的if (drawIt) {
- 小问题:paintComponent 应该是
protected
,而不是 public
。
我编写了一个程序,在单击“确定”按钮后绘制 50 个矩形。但我不明白为什么它在调整 window 大小后消失,使用滚动条或再次单击“确定”。 这是我的代码(我有两个 类:drawingPanel 和 Main) drawingPanel.java:
import javax.swing.*;
import java.awt.*;
public class drawingPanel extends JPanel
{
public boolean drawIt = false;
public int x = 140,y = 0;
public void paintIt()
{
drawIt = true;
repaint();
}
public void paintComponent(Graphics g)
{
if (drawIt == true)
{
super.paintComponent(g);
for (int i = 1; i <= 50; i++)
{
g.fillRect(x, y, 50, 50);
y += 70;
}
}
}
}
Main.java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame
{
private drawingPanel draw = new drawingPanel();
private JPanel controlPanel = new JPanel();
private JButton ok = new JButton("OK");
private JScrollPane scroll = new JScrollPane(draw);
public Main()
{
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Demo");
setLayout(new BorderLayout());
controlPanel.setLayout(new FlowLayout());
controlPanel.add(ok);
ok.addActionListener(new okListener());
draw.setPreferredSize(new Dimension(100,1000));
add(controlPanel, BorderLayout.NORTH);
add(scroll,BorderLayout.CENTER);
setVisible(true);
}
private class okListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
draw.paintIt();
}
}
public static void main(String[] args)
{
new Main();
}
}
请帮助我,在此先感谢。
像这样在您的绘制组件方法中重新初始化 x 和 y 字段,这样它们就不会在每次绘制 JPanel 时一直增加到看不见的地方:
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // move this here
if (drawIt) {
x = 140; // add these guys
y = 0;
for (int i = 1; i <= 50; i++) {
// .... etc....
事情应该会顺利进行。
其他与您的问题无关的小问题:
- 应该始终调用 super 的绘制方法,因此将其从 if 块中拉出。
- 将绘图面板 class 重命名为
DrawingPanel
以使其符合 Java 约定。 - 最好把
if (drawIt == true) {
改成更简单的if (drawIt) {
- 小问题:paintComponent 应该是
protected
,而不是public
。