0

我对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 );
}

}

4

2 回答 2

1

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

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

view.setVisible(false);

在你的按钮的动作监听器中:

view.setVisible(true);

为什么你有你的问题:

默认情况下,您创建的每个 Visual 对象都是可见的。当您将对象添加到板上时,它因此被绘制。

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

于 2013-04-05T23:37:45.633 回答
1

首先,放弃您在 Swing 中控制绘制过程的错觉,但您并没有。Swing 使用由 控制的被动重绘过程,RepaintManager该对象负责决定应该重绘什么以及何时重绘。

paintComponent由 代表您作为重绘链的一部分调用,RepaintManager并且可能出于多种原因(许多在您的直接控制之外)而被调用。

您的代码完全按照您的要求执行。

如果你想改变组件绘制的状态,那么你应该使用某种状态变量来告诉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。

看一眼

更多细节

于 2013-04-05T23:57:25.813 回答