2016-05-23 73 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我前面提到的建议不使用这些方法,因此考虑删除它们。
相关问题