繁体   English   中英

为什么我需要单击两次才能使JButton工作?

[英]Why i need to click twice to let my JButton work?

我正在构建一个在JPanel上绘制random (User input) rectangles的程序。

问题一:

每当我在JTextfield键入数字时,我都需要在JTextfield上单击两次以显示“ Rectangles

问题2:

当我在JTextField中键入新数字时,该数字不显示矩形,但显示我先前键入的矩形。

码:

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:由于要调用setPreferredSize(...)方法(实际上应按此答案所述重载getPreferredSize()方法setPreferredSize(...) ,因此您第一次看不到MyDrawing JPanel上绘制的正方形。 它们也有可能在屏幕外绘制。 您可以设置的首选高度MyDrawing1000 ,它不适合在我的笔记本电脑的屏幕 (绿线是边境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上调用draw时调用revalidate()repaint()

要解决问题2,请从west删除旧的MyDrawing ,添加新的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();
}
...

其他事项

  • 您在FRAME_WIDTH切换了TH
  • 您可以将JButton1ActionPerformed(...)的代码放入实际的actionPerformed方法中。
  • 无论是否在westeastbutton上调用setSize(...) ,您的JFrame看起来都完全相同,而我之前提到的答案建议您不要使用这些方法,因此请考虑删除它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM