2013-04-05 48 views
0

我是比較新的Java,我只是想編寫一個圖形用戶界面,當按下按鈕時繪製一個框。我的問題是,我的程序在按下按鈕之前繪製了框,我不知道如何解決這個問題。爲什麼在按下按鈕之前繪製一個框?

這是我的控制器類:

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

}

回答

1

你有很多方法可以做到這一點。

例如,您可以將TestView的可見性設置爲false,直到按下按鈕。

view.setVisible(false); 

,並在按鈕的動作監聽器:

view.setVisible(true); 

爲什麼你有你的問題:

創建的每一個視覺對象默認爲可見。 當您將對象添加到電路板時,它因此被繪製。

此調用顯示了您的對象:contentPane.add(view,BorderLayout.CENTER);

+1

謝謝!我仍然不明白爲什麼它在按鈕被按下之前畫框。 – user1676471 2013-04-05 23:55:10

+0

@ user1676471檢查我編輯的答案 – 2013-04-06 11:19:59

1

首先,放開你控制Swing中的繪畫過程的錯覺,你不這樣做。 Swing使用被RepaintManager控制的被動重繪過程,因此這個對象有責任決定什麼以及什麼時候應該重新繪製。

paintComponentRepaintManager以您的名義稱爲repaint鏈的一部分,並且可能由於許多原因(很多是您的直接控制之外)而被調用。

您的代碼完全按照您的要求進行操作。

如果要更改組件繪畫的狀態,那麼你或許應該使用某種狀態變量來告訴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。

看看

詳情

相關問題