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