我对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。添加(视图、BorderLayout.CENTER);首先,放弃您在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。
看一看
- 执行自定义绘画
- 在AWT和Swing中绘画
查看更多详细信息