2016-05-23 4 views
0

JPanelrandom (User input) rectanglesを描画するプログラムを作成しています。JButtonを動作させるために2回クリックする必要があるのはなぜですか?

問題1:私は私のJTextfieldに数値を入力するたびに

、私が表示されるまでRectanglesため に二回のJButtonをクリックする必要があります。

問題2:私はJTextFieldの中に新しい番号を入力すると

その数は長方形を表示しませ んが、それは私が以前に入力した長方形を示しています。

CODE:

private void init() { 

    final int FRAME_WIDHT = 800; 
    final int FRAME_HEIGHT = 1000; 
    int input = 3; 

    JFrame frame = new JFrame(); 
    frame.setSize(FRAME_WIDHT, FRAME_HEIGHT); 
    frame.setTitle("Frame"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    west = new JPanel(); 
    west.setSize(500, 500); 
    west.setBorder(BorderFactory.createLineBorder(Color.black)); 

    east = new JPanel(); 
    east.setSize(300, 1000); 

    button = new JButton("Add squares"); 
    field = new JTextField(10); 
    button.setSize(100, 50); 
    east.add(button); 
    east.add(field); 
    east.setBorder(BorderFactory.createLineBorder(Color.black)); 

    button.addActionListener(new java.awt.event.ActionListener() { 

     @Override 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      JButton1ActionPerformed(evt); 
     } 

     public void JButton1ActionPerformed(ActionEvent evt) { 

      int aantalRect = Integer.parseInt(field.getText()); 

      MyDrawing draw = new MyDrawing(aantalRect); 

      west.add(draw); 
      draw.revalidate(); 
      draw.repaint(); 

     } 
    }); 

    frame.add(west, BorderLayout.CENTER); 
    frame.add(east, BorderLayout.EAST); 

    frame.setResizable(true); 
    frame.setVisible(true); 

} 

public static void main(String[] a) { 

    P1027 form = new P1027(); 

} 

} 

class MyDrawing extends JPanel { 

int input = 0; 

public MyDrawing(int i) { 

    this.input = i; 

} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Random r = new Random(); 

    setPreferredSize(new Dimension(500, 1000)); 

    for (int i = 0; i < input; i++) { 

     int x = r.nextInt(460); 
     int y = r.nextInt(960); 

     g.drawRect(x, y, 40, 40); 

    } 

} 

Can any one tell me how to fix that?

答えて

1

問題1:あなたはsetPreferredSize(...)メソッドを呼び出しているので、四角はあなたのMyDrawingJPanel初めての上に描かれて見ることにしていません、実際にgetPreferredSize()メソッドをthis answerで説明されているようにオーバーライドする必要があるとき。また、でもオフスクリーンで表示されます。好ましい高さをMyDrawingに設定してmy laptop's screen(緑色の線はMyDrawingの境界線)に収まらない1000に設定します。

class MyDrawing extends JPanel { 

    ... //Constructor 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(500, 500); //Changed from 1000 to 500 
    } 

    ... //paintComponent(...) 
     //If you change 1000 to 500, don't forget to change 960 to 460 too 
} 

問題2:あなたはので、以前JTextFieldに入力された長方形の量見ている:

を、問題1を解決するメソッドをオーバーライドし、必要に応じて好ましい高さを低くする

  • 新しいものを追加する前に、以前に追加したMyDrawingwestから削除するのを忘れてしまいます。
  • drawの親コンポーネントで呼び出す場合は、westrevalidate()repaint()を呼び出しています。

revalidate()repaint()を呼び出して、新しいものを追加し、westから古いMyDrawingを削除し、問題2を解決するには、次の

... 
public void JButton1ActionPerformed(ActionEvent evt) { 
    west.removeAll(); //If the old MyDrawing is the only thing 
         //that has been added to west. Otherwise use 
         //remove(int index) or remove(Component comp) 
    west.add(draw); 
    west.revalidate(); 
    west.repaint(); 
} 
... 

他のもの

  • あなたは切り替えTおよびHFRAME_WIDTHにあります。
  • JButton1ActionPerformed(...)のコードを実際のactionPerformedメソッドに入れることができます。
  • あなたJFrameは、私が先に述べたwestsetSize(...)east、およびbuttonthat answerへの呼び出しとないまったく同じで、これらのメソッドを使用していないことを示唆しているに見えますので、それらを削除することを検討。
関連する問題