2016-05-23 74 views
0

我正在構建一個程序,該程序在JPanel上繪製了random (User input) rectangles爲什麼我需要點擊兩次讓我的JButton工作?

問題1:

每當我鍵入一個數字在我JTextfield,我需要在 點擊兩次將JButton爲Rectangles露面。

問題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:你不會看到正方形被繪製在你MyDrawingJPanel第一次,因爲您所呼叫的setPreferredSize(...)方法,當你真的應該重寫getPreferredSize()方法時,如this answer所解釋的那樣。這也是可能,他們正在脫離屏幕。您將MyDrawing的首選高度設置爲1000,該值不適用於my laptop's screen(綠線是MyDrawing的邊界)。

要解決問題1,覆蓋的方法,降低必要時首選高度:

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以前的量,因爲:

  • 在忘記刪除以前添加的MyDrawing之前,從west刪除,然後再添加新的。
  • 如果您應該在其父組件west上調用它,請致電revalidate()repaint()draw

要解決問題2,從west刪除舊MyDrawing,添加新的一個,然後調用revalidate()repaint()

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

其他的事情

  • 你切換TH左右FRAME_WIDTH
  • 您可以將JButton1ActionPerformed(...)中的代碼放入實際的actionPerformed方法中。
  • JFrame長得一模一樣的有和無的調用setSize(...)westeastbuttonthat answer我前面提到的建議不使用這些方法,因此考慮刪除它們。
相關問題