2017-03-26 19 views
1

[OK]ボタンをクリックした後に50個の四角形を描画するプログラムを作成します。しかし、私は、ウィンドウのサイズを変更した後、スクロールバーを使う、または再びOKをクリックして消えてしまう理由を理解していない。 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(); 
    } 
} 

が私を助けてください、事前に感謝: はここに私のコードです(drawingPanelとメイン私は2つのクラスがあります)。

答えて

1

彼らはビューの外のJPanelが描かれるたびに増加し続けるしないようにように、あなたのペイントコンポーネントメソッド内のxとyのフィールドを再初期化します。

@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.... 

と物事がOK描く必要があります。

あなたの質問に関連していない他のマイナーな問題は:

  • スーパーの塗装方法は常に呼ばれる、もしそうならばブロックの外にそれを引くべきです。
  • drawingPanelクラスの名前をDrawingPanelに変更し、Java規則に準拠させます。
  • よりシンプルif (drawIt) {
  • マイナー屁理屈にif (drawIt == true) {を変更することがベター:paintComponentはprotected、ないpublicでなければなりません。
+0

OMG!それは働いた、ありがとう。しかし、なぜ私はxとyを再初期化する必要があるのか​​説明できますか? –

+0

@NguyenHoa:それ以外の場合、xとyは増加し続け、四角形を描くことになりますが、視界から外れます。 –

+0

ああ、私はそれを得た。どうもありがとうございます!!! ^^ –

関連する問題