如何删除一个对象框架jframe,然后添加另一个(带有代码)

9udxz4iz  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(169)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

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);

}
}

pdsfdshx

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 ,请参阅以下答案,您可以使用 ListTaxi 对象并在 paintComponent 方法。

szqfcxe2

szqfcxe22#

我通过@peeskillet实现了许多建议,并对代码进行了一些清理,结果如下。

import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;

public class TaxiFrame
extends JFrame
implements ActionListener {

    private JLabel label1 = new JLabel("Number of Taxis:");
    private JLabel label2 = new JLabel("Type an integer and press enter");
    private JTextField inputField = new JTextField(10);
    private JPanel taxiPanel = new JPanel();

    private Dimension tpSize = new Dimension(600, 400);
    private Random rand = new Random();

    public TaxiFrame() {
        super("This is the Frame");
        getContentPane().setBackground(Color.CYAN);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout(10, 10));

        taxiPanel.setLayout(null);
        taxiPanel.setOpaque(false);
        taxiPanel.setPreferredSize(tpSize);
        add(taxiPanel, BorderLayout.CENTER);

        JPanel p = new JPanel();

        p.setOpaque(false);
        p.add(label1);
        p.add(inputField);
        p.add(label2);
        add(p, BorderLayout.SOUTH);

        inputField.addActionListener(this);

        inputField.setText("5");
        addNewTaxis(5);

        pack();
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void addNewTaxis(int numTaxis) {
        for(int i = 0; i < numTaxis; i++) {
            addNewTaxi();
        }
    }

    private void addNewTaxi() {
        TaxiCanvas tc = new TaxiCanvas();
        tc.setBounds(
            rand.nextInt(tpSize.width - 100),
            rand.nextInt(tpSize.height - 100),
            100, 100
        );
        taxiPanel.add(tc);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == inputField) {
            int numTaxis = Integer.parseInt(inputField.getText());

            if(numTaxis > 0) {
                taxiPanel.removeAll();
                addNewTaxis(numTaxis);

                taxiPanel.revalidate();
                repaint();
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TaxiFrame();
            }
        });
    }

    public static class TaxiCanvas
    extends JComponent {
        private Taxi taxi = new Taxi();

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            taxi.paint(g);
        }
    }

    public static 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);
        }
    }
}


请不要接受这个答案,我只是想表明他们是好的建议,并显示工作代码。有许多与swing相关的小bug,但在其他方面代码可以正常工作。

相关问题