Java正在移动标签?

Java正在移动标签?,java,swing,animation,jlabel,Java,Swing,Animation,Jlabel,我做了一个计算器,一旦我得到答案,我希望标签l4在屏幕上不断移动。谁能告诉我怎么移动它,因为我想不出来 import java.awt.*; import java.awt.event.*; import java.awt.Label; import java.awt.Font; import javax.swing.*; class DanielCalculator implements ActionListener { Timer t = new Timer(5, this); int

我做了一个计算器,一旦我得到答案,我希望标签
l4
在屏幕上不断移动。谁能告诉我怎么移动它,因为我想不出来

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

class DanielCalculator implements ActionListener {

Timer t = new Timer(5, this);
int x = 300;
int y = 50;
DanielCalculatorFrame f = new DanielCalculatorFrame();
Label l1 = new Label("First Number");
Label l2 = new Label("Second Number");
Label l3 = new Label("Result: ");
TextField t1 = new TextField();
TextField t2 = new TextField();
Label l4 = new Label("0");
Button b1 = new Button("Add");
Button b2 = new Button("Subtract");
Button b3 = new Button("Multiply");
Button b4 = new Button("Divide");
DanielCalculator()
{
    l1.setBounds(20, 70, 100, 20);
    l2.setBounds(240, 70, 100, 20);
    l3.setBounds(70, 168, 100, 50);
    t1.setBounds(120, 70, 100, 20);
    t2.setBounds(360, 70, 100, 20); 
    b1.setBounds(230, 130, 50, 20); //3
    b2.setBounds(330, 130, 50, 20); //4
    b3.setBounds(30, 130, 50, 20);  //1
    b4.setBounds(130, 130, 50, 20); //2
    f.add(l1);
    f.add(l2);
    f.add(l3);
    f.add(t1);
    f.add(t2);
    f.add(l4);
    f.add(b1);
    f.add(b2);
    f.add(b3);
    f.add(b4);
    b1.addActionListener(this);
    b2.addActionListener(this);
    b3.addActionListener(this);
    b4.addActionListener(this);
    f.setLayout(null);
    f.setVisible(true);
    f.setSize(600,450);
    Font myFont = new Font("Serif",Font.BOLD,26);
    l4.setFont(myFont);
    l3.setFont(myFont);
    l4.setBounds(200, 170, x, y);
}
public void actionPerformed(ActionEvent e)
{
    double continuee;
    Double n1=Double.parseDouble(t1.getText());
    Double n2=Double.parseDouble(t2.getText());
    if(e.getSource() == b1) {
        l4.setText(String.valueOf(n1+n2));\
    }
    if(e.getSource() == b2) {
        l4.setText(String.valueOf(n1-n2));
    }
    if(e.getSource() == b3) {
        l4.setText(String.valueOf(n1*n2));
    }
    if(e.getSource() == b4) {
        l4.setText(String.valueOf(n1/n2));
    }


}
public static void main (String[] args) {
    new DanielCalculator();
    }   
}

最简单的解决方案可能是使用框架的玻璃窗格,因为它允许您独立于主视图控制布局

说到布局…这就是为什么你应该避免
null
layouts

此示例使用框架的玻璃窗格功能提供动画层,该层将显示在主UI上方

ResultsPane
确实使用了
null
布局,这是您提供此类功能的唯一方式,但它所做的是确保尊重组件的首选大小,允许字体、字体度量和其他渲染差异的差异,这些差异可能会影响其他平台上的大小

“基本计算”窗格使用复合布局方法,其中字段和按钮的布局相互独立

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCalculator {

    public static void main(String[] args) {
        new TestCalculator();
    }

    public TestCalculator() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                ResultPane resultPane = new ResultPane();

                JFrame frame = new JFrame("Testing");
                frame.setGlassPane(resultPane);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new CalculatorPane(resultPane));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ResultPane extends JPanel {

        private JLabel result;
        private Timer timer;

        private int xDelta = (Math.random() > 0.5) ? 1 : -1;
        private int yDelta = (Math.random() > 0.5) ? 1 : -1;

        ;

        public ResultPane() {
            setOpaque(false);
            setLayout(null);
            result = new JLabel();
            Font font = result.getFont();
            font = font.deriveFont(Font.BOLD, 26f);
            result.setFont(font);
            add(result);
            timer = new Timer(40, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    Point point = result.getLocation();
                    point.x += xDelta;
                    point.y += yDelta;
                    if (point.x < 0) {
                        point.x = 0;
                        xDelta *= -1;
                    } else if (point.x + result.getWidth() > getWidth()) {
                        point.x = getWidth() - result.getWidth();
                        xDelta *= -1;
                    }
                    if (point.y < 0) {
                        point.y = 0;
                        yDelta *= -1;
                    } else if (point.y + result.getHeight() > getHeight()) {
                        point.y = getHeight() - result.getHeight();
                        yDelta *= -1;
                    }
                    result.setLocation(point);
                    repaint();
                }

            });
            timer.start();
        }

        public void setResult(Number number) {
            result.setText("Result: " + NumberFormat.getNumberInstance().format(number));
            result.setSize(result.getPreferredSize());
            setVisible(true);
        }

    }

    public class CalculatorPane extends JPanel {

        private final ResultPane resultPane;

        private final JLabel firstNumberLabel = new JLabel("First Number:");
        private final JLabel secondNumberLabel = new JLabel("Second Number:");

        private final JTextField firstNumberField = new JTextField(5);
        private final JTextField secondNumberField = new JTextField(5);

        public CalculatorPane(ResultPane resultPane) {

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;

            this.resultPane = resultPane;

            JPanel fields = new JPanel();
            fields.add(firstNumberLabel);
            fields.add(firstNumberField);
            fields.add(secondNumberLabel);
            fields.add(secondNumberField);

            add(fields, gbc);

            JPanel buttons = new JPanel();
            buttons.add(new JButton(new AddAction()));
            buttons.add(new JButton(new SubtractAction()));
            buttons.add(new JButton(new MultiplyAction()));
            buttons.add(new JButton(new DivideAction()));

            add(buttons, gbc);

        }

        public class AddAction extends AbstractAction {

            public AddAction() {
                putValue(NAME, "+");
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(firstNumberField.getText());
                    double num2 = Double.parseDouble(secondNumberField.getText());

                    double result = num1 + num2;
                    resultPane.setResult(result);
                } catch (NumberFormatException exp) {
                }
            }

        }
        public class SubtractAction extends AbstractAction {

            public SubtractAction() {
                putValue(NAME, "-");
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(firstNumberField.getText());
                    double num2 = Double.parseDouble(secondNumberField.getText());

                    double result = num1 - num2;
                    resultPane.setResult(result);
                } catch (NumberFormatException exp) {
                }
            }

        }
        public class MultiplyAction extends AbstractAction {

            public MultiplyAction() {
                putValue(NAME, "x");
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(firstNumberField.getText());
                    double num2 = Double.parseDouble(secondNumberField.getText());

                    double result = num1 * num2;
                    resultPane.setResult(result);
                } catch (NumberFormatException exp) {
                }
            }

        }
        public class DivideAction extends AbstractAction {

            public DivideAction() {
                putValue(NAME, "/");
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    double num1 = Double.parseDouble(firstNumberField.getText());
                    double num2 = Double.parseDouble(secondNumberField.getText());

                    double result = num1 / num2;
                    resultPane.setResult(result);
                } catch (NumberFormatException exp) {
                }
            }

        }
    }

}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.Font;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Point;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.text.NumberFormat;
导入javax.swing.AbstractAction;
导入静态javax.swing.Action.NAME;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类测试计算器{
公共静态void main(字符串[]args){
新的TestCalculator();
}
公共测试计算器(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
ResultPane ResultPane=新的ResultPane();
JFrame=新JFrame(“测试”);
框。设置玻璃窗格(结果窗格);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
添加(新计算器平面(结果平面));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类ResultPane扩展了JPanel{
私有JLabel结果;
私人定时器;
private int xDelta=(Math.random()>0.5)?1:-1;
private int yDelta=(Math.random()>0.5)?1:-1;
;
公共结果页(){
设置不透明(假);
setLayout(空);
结果=新的JLabel();
Font=result.getFont();
font=font.deriveFont(font.BOLD,26f);
result.setFont(字体);
添加(结果);
计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
Point=result.getLocation();
点x+=xDelta;
点y+=yDelta;
如果(x点<0){
点x=0;
xDelta*=-1;
}else if(point.x+result.getWidth()>getWidth()){
point.x=getWidth()-result.getWidth();
xDelta*=-1;
}
如果(点y<0){
点y=0;
yDelta*=-1;
}else if(point.y+result.getHeight()>getHeight()){
point.y=getHeight()-result.getHeight();
yDelta*=-1;
}
结果:设置位置(点);
重新油漆();
}
});
timer.start();
}
公共无效设置结果(编号){
result.setText(“结果:+NumberFormat.getNumberInstance().format(number));
result.setSize(result.getPreferredSize());
setVisible(真);
}
}
公共类计算器扩展JPanel{
私人最终结果页结果页;
私有最终JLabel firstNumberLabel=新JLabel(“第一个编号”);
专用最终JLabel secondNumberLabel=新JLabel(“第二个号码:”);
私有最终JTextField firstNumberField=新JTextField(5);
私有最终JTextField secondNumberField=新JTextField(5);
公共计算器面板(结果面板结果面板){
setLayout(新的GridBagLayout());
GridBagConstraints gbc=新的GridBagConstraints();
gbc.gridwidth=GridBagConstraints.rements;
this.resultPane=resultPane;
JPanel字段=新的JPanel();
字段。添加(firstNumberLabel);
字段。添加(firstNumberField);
字段。添加(第二个数字标签);
字段。添加(secondNumberField);
添加(字段,gbc);
JPanel按钮=新的JPanel();
add(newjbutton(newaddaction());
add(newjbutton(newsubtractAction());
添加(新的JButton(新的MultiplyAction());
add(newjbutton(newdivideaction());
添加(按钮,gbc);
}
公共类AddAction扩展了AbstractAction{
公共行动(){
putValue(名称“+”);
}
@凌驾
已执行的公共无效操作(操作事件e){
试一试{
双num1
public class J42JLabel_01 extends JLabel {

private static final long serialVersionUID = -42L;
private JWindow           jWindow          = null;
private Timer             timer            = null;

public J42JLabel_01(final String string) {
    super(string);
    setOpaque(true);
}

public void moveIt(final JFrame jFrame) {
    if (jWindow == null) {
        jFrame.getContentPane().remove(this);
        Toolkit.getDefaultToolkit().beep();
        jWindow = new JWindow(jFrame) {
            @Override
            public void dispose() {
                Toolkit.getDefaultToolkit().beep();
                timer.cancel();
                super.dispose();
            }
        };
        jWindow.setAlwaysOnTop(true);
        jWindow.getContentPane().setLayout(new FlowLayout());
        jWindow.getContentPane().add(this);
        jWindow.pack();
        jWindow.setVisible(true);
        timer = new Timer(true);
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                jWindow.setLocation(jWindow.getLocation().x + 25, jWindow.getLocation().y + 24);
                if (jWindow.getLocation().x > Toolkit.getDefaultToolkit().getScreenSize().width / 2) {
                    jWindow.setLocation(0, 0);
                }
                if (jWindow.getLocation().y > Toolkit.getDefaultToolkit().getScreenSize().height / 2) {
                    jWindow.setLocation(0, 0);
                }
            }
        }, 0, 500);
    }
    else {
        jFrame.getContentPane().add(this);
        jWindow.dispose();
        jWindow = null;
    }
}
}
    J42JLabel_01 instructionalExample = new J42JLabel_01(" TEST TESTING TEST ");
    final JFrame jFrame = new JFrame();
    jFrame.getContentPane().add(new JButton("Click") {
        {
            jFrame.getContentPane().add(this);
            addActionListener(new ActionListener() {
                public void actionPerformed(final ActionEvent e) {
                    instructionalExample.moveIt(jFrame);
                    jFrame.repaint();
                    jFrame.validate();
                }
            });
        }
    });
    jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    jFrame.setLayout(new FlowLayout());
    jFrame.getContentPane().add(instructionalExample);
    jFrame.pack();
    jFrame.setLocationRelativeTo(null);
    jFrame.setVisible(true);