【问题标题】:How to move and change the size of a Jpanel rectangle?如何移动和更改 Jpanel 矩形的大小?
【发布时间】:2021-07-19 19:37:15
【问题描述】:

我有一个矩形,我试图让它像某种图形一样增长,但它并没有显示它实时增长,它只有一个白屏,然后我看到一个矩形。任何帮助将不胜感激,谢谢。我遇到问题的代码位于“动画栏”注释下。

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

public class Main extends JPanel {
    static String[] mainArr;
    static int start;
    static boolean done = false;
    static double datapoint1;
    static double datapoint2;
    static int jPlaceholder;

    public static void main(String[] args) throws Exception {

        // Creating the window
        JFrame panel = new JFrame();
        panel.setSize(450,250); 

        // Creating the window that shows the animation
        JFrame drawingFrame = new JFrame();
        drawingFrame.setSize(450,250);
        JPanel jp = new JPanel();
        jp.setLayout(null);
        jp.setBackground(Color.red);
        drawingFrame.add(jp);

        // Creating all the text fields
        JTextField dataTypesTextField = new JTextField("This box is currently not in use. Please do not type anything into this box");
        dataTypesTextField.setBounds(50,50, 400,30);
        panel.add(dataTypesTextField);
        JTextField yearStartTextField = new JTextField("Type in this box what year your data starts in:");
        yearStartTextField.setBounds(50,100, 400,30);
        panel.add(yearStartTextField);
        JTextField yearEndTextField = new JTextField("Type in this box what year your data ends in:");
        yearEndTextField.setBounds(50,150, 400,30);
        panel.add(yearEndTextField);

        // Creating the button to submit the data
        JButton enterButton = new JButton("Enter");
        enterButton.setBounds(50,200, 100, 30);
        panel.add(enterButton);

        // =================================== ActionListener for enter button ========================================

        enterButton.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {

                if (done==false) {
                    // Creating the variables to store the data the user just inputted
                    start = Integer.parseInt(yearStartTextField.getText());
                    int end = Integer.parseInt(yearEndTextField.getText());
                    mainArr = new String[end-start+1];

                    // Gets the data points
                    dataTypesTextField.setText("Datapoints you will use in order, space between each: ");
                    done = true;
                } else {
                    // Getting all the data needed
                    mainArr = dataTypesTextField.getText().split(" ");
                    double[] datapoints = new double[mainArr.length];
                    for (int i=0; i<datapoints.length; i++) {
                        datapoints[i] = Double.parseDouble(mainArr[i]);
                    }

我很确定这里是我遇到问题的地方,但我本可以在其他地方搞砸。

                    // Animates the bar
                    for (int i=0; i<datapoints.length-1; i++) {

                        // Getting all the datapoints
                        datapoint1 = datapoints[i];
                        datapoint2 = datapoints[i+1];
                        int j = 0;
                        while(j<50) {
                            j++;
                            int width = (int) (datapoint1+((datapoint2-datapoint1)/50)*j);
                            JPanel rectangle = new JPanel();
                            rectangle.setBackground(Color.black);
                            rectangle.setBounds(50, 50, width, 30);
                            jp.add(rectangle);
                            drawingFrame.setVisible(true);
                            rectangle.repaint();
                            System.out.println("The width is: "+width);

起初我以为是因为每个“帧”之间没有停顿,但它仍然只是显示一个白屏,然后它显示了矩形。

                            try {
                                Thread.sleep(20);
                            } catch (Exception exp) {

                            }
                            
                        }
                    }
                }
            }
        });

        // =====================================================================================================
        
        // Finishes up both the windows
        panel.setLayout(null);
        panel.setVisible(true);

    }
}

【问题讨论】:

标签: java


【解决方案1】:

这是如何移动 jpanel 的示例

移动面板

import java.awt.Component;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MovingDialog {
   private static void createAndShowGui() {
      JPanel panel = new JPanel();
      panel.add(new JButton(new ShowMovingDialogAction()));
      JFrame frame = new JFrame("MovingDialog");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(panel);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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

class ShowMovingDialogAction extends AbstractAction {
   private JPanel panel = new JPanel();

   public ShowMovingDialogAction() {
      super("Show Moving Dialog");
      panel.add(new JLabel("label"));
      panel.add(new JTextField("TextField", 10));
      panel.add(new JButton("Button"));
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      JFrame owner = (JFrame) SwingUtilities.getWindowAncestor((Component) e
            .getSource());
      final JDialog dialog = new JDialog(owner, "Dialog",
            ModalityType.APPLICATION_MODAL);
      dialog.getContentPane().add(panel);
      dialog.pack();
      dialog.setLocation(0, 0);

      int delay = 20;
      new Timer(delay , new ActionListener() {
         int x = 0;
         int y = 0;
         Dimension scrn = Toolkit.getDefaultToolkit().getScreenSize();

         @Override
         public void actionPerformed(ActionEvent e) {
            int maxX = scrn.width - dialog.getWidth();
            int maxY = scrn.height - dialog.getHeight();
            if (x < maxX  && y < maxY) {
               x++;
               y++;
               dialog.setLocation(x, y);
            } else {
               ((Timer)e.getSource()).stop();
            }
         }
      }).start();

      dialog.setVisible(true);

   }
}

请注意,动画 Swing Timer 必须在调用 setVisible(true) 之前启动。也许这就是吉尔伯特所指的。

【讨论】:

  • 谢谢,但我真的不知道该怎么处理这个,抱歉。我有点笨
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2014-05-17
相关资源
最近更新 更多