Java 为什么在按下按钮之前,这幅画是一个方框?

Java 为什么在按下按钮之前,这幅画是一个方框?,java,swing,actionlistener,repaint,Java,Swing,Actionlistener,Repaint,我对java比较陌生,我只是尝试编写一个GUI,当按下按钮时,它会绘制一个方框。我的问题是,我的程序在按下按钮之前绘制了框,我不知道如何解决这个问题 这是我的控制器类: import java.awt.*; import javax.swing.*; import java.awt.event.* ; public class TestController extends JFrame { private JButton enterButton; private JPanel buttonH

我对java比较陌生,我只是尝试编写一个GUI,当按下按钮时,它会绘制一个方框。我的问题是,我的程序在按下按钮之前绘制了框,我不知道如何解决这个问题

这是我的控制器类:

import java.awt.*;
import javax.swing.*;
import java.awt.event.* ;


public class TestController extends JFrame {
private JButton enterButton;
private JPanel buttonHolder;
private Container contentPane;
private TestView view;

public TestController() {
    contentPane = getContentPane();
    enterButton = new JButton("Enter");
    buttonHolder = new JPanel();
    buttonHolder.setPreferredSize(new Dimension (600, 100));
    contentPane.add(buttonHolder, BorderLayout.SOUTH);

    buttonHolder.add(enterButton);

    view= new TestView();       
    view.setPreferredSize(new Dimension (125, 125));
    contentPane.add(view, BorderLayout.CENTER);

    enterButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            view.repaint(); 
        }
    });

}
public static void main(String[] args) {
     TestController bc = new TestController() ;
     bc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
     bc.pack();
     bc.setVisible(true) ;  

}

}
这是我的观点课:

import java.awt.* ;     
import java.awt.geom.*;
import javax.swing.* ;

public class TestView extends JPanel {
public TestView() {}

public void paintComponent( Graphics g ){
    super.paintComponent( g );
    Graphics2D g2= ( Graphics2D ) g;
    Rectangle2D rect= new Rectangle2D.Double(0, 0, 30, 30); 
    g2.setPaint( Color.CYAN );
    g2.fill( rect );
}

}你有很多方法可以做到这一点

例如,您可以将
TestView
的可见性设置为false,直到按下按钮

view.setVisible(false);
在按钮的动作侦听器中:

view.setVisible(true);
你为什么会有问题:

默认情况下,您创建的每个可视对象都是可见的。 当你把你的对象添加到黑板上时,它就被画出来了


此调用显示了您的对象:contentPane.add(视图,BorderLayout.CENTER)

首先,不要幻想你在挥杆中控制绘画过程,你不会。Swing使用一个被动重绘过程,该过程由
重绘管理器
控制,该对象负责决定重绘的内容和时间

RepaintManager
会代表您调用
paintComponent
作为重绘链的一部分,并且可能会出于多种原因调用
paintComponent
(许多原因不在您的直接控制范围内)

您的代码正按照您的要求执行

如果要更改组件绘制的状态,则可能应该使用某种状态变量告诉
paintComponent
它是否应该绘制矩形

private boolean paintRect = false;

public void paintComponent( Graphics g ){
    super.paintComponent( g );
    if (paintRect) {
        Graphics2D g2= ( Graphics2D ) g;
        Rectangle2D rect= new Rectangle2D.Double(0, 0, 30, 30); 
        g2.setPaint( Color.CYAN );
        g2.fill( rect );
    }
}
然后需要在
TreeView
类中提供对状态变量的某种访问

public void setPaintRect(boolean paint) {
    paintRect = paint;
    repaint();
}
现在,在
actionPerformed
方法中,您只需要设置状态

enterButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        view.setPaintRect(true); // or what ever you want.
    }
});
旁注。您的
TreeView
应该覆盖
getPreferredSize
,并为其他布局管理器返回合适的大小提示。您可以通过使用
BorderLayout
并手动设置帧的大小来解决这个问题,但是
TreeView
的默认大小是0x0

看看


有关详细信息

谢谢!我仍然不明白为什么它在按下按钮之前画了这个盒子。