Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何移动和更改Jpanel矩形的大小?_Java - Fatal编程技术网

Java 如何移动和更改Jpanel矩形的大小?

Java 如何移动和更改Jpanel矩形的大小?,java,Java,我有一个矩形,我试图把它像某种图形一样增长,但它并没有实时显示它的增长,它只有一个白色屏幕,然后我看到一个矩形。任何帮助都将不胜感激,谢谢。我遇到问题的代码位于“动画条”注释下 import javax.swing.*; import java.awt.event.*; import java.awt.*; public class Main extends JPanel { static String[] mainArr; static int start; st

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

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

这是如何移动jpanel的示例

移动jpanel

导入java.awt.Component;
导入java.awt.Dialog.ModalityType;
导入java.awt.Dimension;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
公共类移动对话框{
私有静态void createAndShowGui(){
JPanel面板=新的JPanel();
添加(新的JButton(新的ShowMovingDialogAction());
JFrame=新JFrame(“移动对话框”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
类ShowMovingDialogAction扩展了AbstractAction{
private JPanel panel=new JPanel();
公共ShowMovingDialogAction(){
超级(“显示移动对话框”);
面板。添加(新的JLabel(“标签”);
添加(新JTextField(“TextField”,10));
面板添加(新的按钮);
}
@凌驾
已执行的公共无效操作(操作事件e){
JFrame所有者=(JFrame)SwingUtilities.GetWindowAn祖((组件)e
.getSource());
最终JDialog对话框=新JDialog(所有者,“对话框”,
ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(面板);
dialog.pack();
设置位置(0,0);
int延迟=20;
新计时器(延迟,新ActionListener(){
int x=0;
int y=0;
维度scrn=Toolkit.getDefaultToolkit().getScreenSize();
@凌驾
已执行的公共无效操作(操作事件e){
int maxX=scrn.width-dialog.getWidth();
int maxY=scrn.height-dialog.getHeight();
if(x

请注意,在调用setVisible(true)之前,必须启动动画摆动计时器。也许这就是Gilbert所指的。

如果您显示的代码是完整的,至少是带有“animates the bar”注释的循环,那么您是在事件调度线程上执行的(您肯定应该这样做)。将循环放入SwingWorker(即一个单独的线程),如果代码的其余部分正确(没有检查),它应该可以工作。对于SwingWorker,请查看代码的结构是否不正确。main()方法只能用于创建框架和向框架添加组件。您不应该使用静态变量。您不应该扩展JPanel,除非您实际添加了该类的逻辑。看看:还有不同的例子,使用动画。谢谢,但我真的不知道我该怎么做,对不起。我有点笨
                    // 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);

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

   }
}