[英]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
上绘制的正方形。 它们也有可能在屏幕外绘制。 您可以设置的首选高度MyDrawing
到1000
,它不适合在我的笔记本电脑的屏幕 (绿线是边境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
切换了T
和H
JButton1ActionPerformed(...)
的代码放入实际的actionPerformed
方法中。 west
, east
和button
上调用setSize(...)
,您的JFrame
看起来都完全相同,而我之前提到的答案建议您不要使用这些方法,因此请考虑删除它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.