**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
6年前关门了。
改进这个问题
我写了一个程序,在jframe的画布上画了5幅画。我现在添加了一个jtextfield,这样用户就可以使用actionlistener输入一个数字。
理想情况下,用户输入的数字应该会在新画布上产生相应数量的图片。
问题是,我不能删除画布对象,并添加一个新的画布上的新数量的图片。
请帮忙
public class TaxiFrame extends JFrame implements ActionListener {
private JLabel L1 = new JLabel("Number of Taxis:");
private JLabel L2 = new JLabel("Type an integer and press enter");
private JTextField t1 = new JTextField (" ");
public TaxiFrame() {
super("This is the Frame");
setSize(600, 400);
getContentPane().setBackground(Color.CYAN);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
Random rx = new Random();
Random ry = new Random();
for(int i = 0; i < 5; i ++)
{
TaxiCanvas tax = new TaxiCanvas();
tax.setBounds(rx.nextInt(600 - 100), ry.nextInt(400 - 100), 100, 100);
add(tax);
}
JPanel p = new JPanel();
p.setOpaque(false);
p.add(L1);
getContentPane().
add("South", p);
p.setOpaque(false);
p.add(t1);
getContentPane().
add("South", p);
p.setOpaque(false);
p.add(L2);
getContentPane().
add("South", p);
setVisible(true);
t1.addActionListener(this);
}
public static void main(String[] args) {
new TaxiFrame();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == t1)
{
if(Integer.parseInt(t1.getText()) > 0)
{
getContentPane().removeAll();
TaxiCanvas tax = new TaxiCanvas();
add(tax);
}
}
}
}
多谢了
出租车画布代码为import java.awt.*; import javax.swing.*; public class TaxiCanvas extends JComponent { private Taxi taxi = new Taxi(); public void paint(Graphics g) { taxi.paint(g); } } taxi code
```
import java.awt.*;
public class Taxi
{
public void paint(Graphics g)
{
// drawing the car body
g.setColor(Color.yellow);
g.fillRect(0,10, 60, 15);
// drawing the wheels
g.setColor(Color.black);
g.fillOval(10, 20, 12, 12); // left wheel
g.fillOval(40, 20, 12, 12); // right wheel
int x[] = {10, 20, 40, 50}; // coordinate arrays for the
int y[] = {10, 0, 0, 10}; // car cabin
g.setColor(Color.yellow);
g.fillPolygon(x, y, 4); // drawing the cabin in yellow
g.setColor(Color.black);
g.drawString("20", 25, 22);
g.drawLine(0, 25, 60, 25);
}
}
2条答案
按热度按时间pdsfdshx1#
删除和添加组件时,需要
revalidate()
以及repaint()
与其添加和删除容器,不如考虑使用CardLayout
这将“分层”你的容器,让你浏览它们。了解如何使用cardlayout不要覆盖
paint
方法JComponent
. 而是重写paintComponent
一定要打电话super.paintComponent
为了不破坏油漆链,可能会留下油漆文物。不要使用此已弃用
add("South", p);
方法。而是使用add(p, BorderLayout.SOUTH)
试图tax.setBounds
在布局设置(不为空)时,就放置而言,将不起任何作用你想给“南方”加上很多次。每个位置只能容纳一个组件
添加到时
BorderLayout
,如果添加时未指定位置,则会自动添加到CENTER
. 因此,如果尝试添加多个组件而不指定位置,则只会显示最后添加的组件。swing应用程序应该在事件调度线程(edt)上运行。可以通过将代码 Package 到
main
在一个SwingUtilities.invokeLater...
. 在初始线程中查看更多老实说,我不知道你的代码试图做什么,但看看下面radiodef的评论,看看它是否对你有什么意义。
如果要添加多个
Taxi
对象到您的TaxiCanvas
,请参阅以下答案,您可以使用List
的Taxi
对象并在paintComponent
方法。szqfcxe22#
我通过@peeskillet实现了许多建议,并对代码进行了一些清理,结果如下。
请不要接受这个答案,我只是想表明他们是好的建议,并显示工作代码。有许多与swing相关的小bug,但在其他方面代码可以正常工作。