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

时间:2014-03-11 19:17:26

标签: java

我编写了一个程序,在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.*;
import javax.swing.*;
public class TaxiCanvas extends JComponent
{
  private Taxi taxi = new Taxi();
  public void paint(Graphics g)
  {
    taxi.paint(g);

  }
}

2 个答案:

答案 0 :(得分:2)

  1. 删除和添加组件时,您需要revalidate()repaint()

  2. 不要添加和删除容器,而应考虑使用“分层”容器的CardLayout,并让您浏览它们。请参阅How to use CardLayout

  3. 不要覆盖paint的{​​{1}}方法。而是覆盖JComponent,并确保调用paintComponent不要破坏油漆链,并可能留下油漆工件。

  4. 请勿使用此已弃用的super.paintComponent方法。而是使用add("South", p);

  5. 在布局设置(非空)时,尝试add(p, BorderLayout.SOUTH)将无法执行任何操作

  6. 您试图多次添加到“South”。每个职位只能持有一个部分

  7. 添加到tax.setBounds时,如果您在添加时未指定位置,则会自动添加到BorderLayout。因此,如果您尝试添加多个组件而未指定位置,则只会显示您添加的最后一个组件。

  8. Swing应用程序应该在Event Dispatch Thread(EDT)上运行。您可以将代码包含在CENTER main中。详情请见Initial Threads

  9. 老实说,我不知道你的代码试图做什么,但请看下面的RadioDef评论,看看它对你来说是否意味着什么。

  10. 如果您想向SwingUtilities.invokeLater...添加多个Taxi个对象,请参阅this answer您可以使用TaxiCanvas ListTaxi个对象的内容在paintComponent方法中迭代它们。

答案 1 :(得分:0)

我实现了@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);
        }
    }
}

looks working

请不要接受这个答案,我只想表明他们是好建议并展示工作代码。有很多与Swing相关的小错误,但代码仍有效。