当前位置: 首页 > 知识库问答 >
问题:

EDT(Java)如何拆分几个操作/事件的问题

池宸
2023-03-14

基本上,我有一个JFrame

顶部颜色标签需要不时地改变颜色(不到一秒),比如说,他们需要在底部拍摄投射物。底部的playerLabel需要绕x轴移动,这样才能阻挡镜头。

我的问题是,当我激活SwingWorkercolalLabels上的任何线程,以便他们可以拍摄投射物并更改颜色时,我的EDT被阻止,因此我无法移动playLabel(事件不起作用)。我的意思是它们可以工作,但与此同时,playerLabel回到原始位置。(EDT被阻止)

我的问题是,我如何将colyLabel(顶部标签)上的操作与playerLabel(底部标签)上的操作分开?

如何使彩色标签发挥作用,并能够移动播放器标签?基本上,如何解除EDT的封锁,并仍然有或行动。

编辑:

static Point click;
static int thisX;
static int xMoved;
static int x;
static Integer elapsed = 0;

public static void main(String[] args) {

    JFrame frame = new JFrame();
    SpringLayout sp = new SpringLayout();
    frame.setLayout(sp);

    JLabel label = new JLabel("This is label");
    label.setBorder(BorderFactory.createLineBorder(Color.red));
    JLabel timeLabel = new JLabel("Time: ");

    frame.add(label);
    sp.putConstraint(SpringLayout.NORTH, label, 10, SpringLayout.NORTH, frame);
    sp.putConstraint(SpringLayout.WEST, label, 10, SpringLayout.WEST, frame);

    frame.add(timeLabel);
    sp.putConstraint(SpringLayout.NORTH, timeLabel, 100, SpringLayout.NORTH, frame);
    sp.putConstraint(SpringLayout.WEST, timeLabel, 100, SpringLayout.WEST, frame);

    frame.setSize(600, 400);
    frame.setVisible(true);



     Timer t = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            elapsed++;
           timeLabel.setText("Time: " + elapsed);
        }
    });


         label.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            click = e.getPoint();
        }
});

     label.addMouseMotionListener(new MouseAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            thisX = label.getLocation().x;
            xMoved = (thisX + e.getX()) - (thisX + click.x);
            x = thisX + xMoved;
                   label.setLocation(x, label.getLocation().y);
                   label.repaint();       
        }    
});

     t.start();


}

共有1个答案

毋澄邈
2023-03-14

您将无法在有侦听器要移动的标签周围移动。

这是因为您使用的是布局管理器。布局管理器将确定零部件的大小/位置,即使您手动设置了位置。

如果您需要动态移动组件的能力,那么您需要将组件添加到具有空布局的面板中。然后您将负责设置组件的初始大小/位置。

所以我建议你:

  1. u使用框架的默认边框布局
  2. 将“文本标签”添加到边框布局。开始
  3. 将带有空布局的JPanel添加到BorderLayout。中心
  4. 将要拖动的标签添加到上面的面板
  5. 请参阅移动窗口中的基本拖动部分,了解一个简单的类,该类允许您在面板周围拖动标签
 类似资料:
  • 问题内容: 我正在尝试将我的应用拆分为几个文件: 我的第一个猜测是这样做: 这不起作用,然后我发现了这个问题,但是在此解决方案中,我仍然遇到问题,当我运行时,出现类似以下内容: 我对此不太确定,但我担心有关该部分的内容 : 这是我的model1.py文件: 这是我的model3.py文件: 显然可以,但是我收到了评论,如果我尝试执行此操作,则会发生相同的事情: 因此,我应该手动运行alter fo

  • 我正在实现一个KeyEventDispatcher。dispatchKeyEvent()将所有键盘操作传递给外部(Android)设备。将KeyEvents轻松转换为设备提供的协议的一个关键问题是将事件分为两种类型:Unicode事件和“动作事件”(杂项、编辑、导航键-F1、Del、箭头等)。 Java非常方便地告诉用户击键生成的Unicode字符:您只需检查是否,并且保证生成的字符为。无需处理修

  • 上一章我们通过 multiline 插件将多行数据合并进一个事件里,那么反过来,也可以把一行数据,拆分成多个事件。这就是 split 插件。 配置示例 filter { split { field => "message" terminator => "#" } } 运行结果 这个测试中,我们在 intputs/stdin 的终端中输入一行数据:"

  • 本文向大家介绍java实现把一个List集合拆分成多个的操作,包括了java实现把一个List集合拆分成多个的操作的使用技巧和注意事项,需要的朋友参考一下 有些时候我们需要对一批数据进行分批处理, 使用subList方法可以实现对List集合进行固定长度的分割. 输出结果: 补充知识:java将大集合按照固定长度拆分为小集合 我们在使用java中的集合(Collection、List、Set等)的

  • 本文向大家介绍perl几个文件操作例子,包括了perl几个文件操作例子的使用技巧和注意事项,需要的朋友参考一下 perl用的最多的地方就算是文件处理了,下面我就总结了一下perl文件操作的一些东西,并且有具体的例子,通过下面的例子,加强我们对perl文件操作的理解。 删除文件 使用unlinke函数,比如unlink $file, unlink $file1, $file2, $file3 打开文

  • 问题内容: 我有一个在EDT上运行的方法,在其中我想使它在新的(非EDT)线程上执行某些操作。我当前的代码如下: 问题答案: 您可以创建并启动一个新的Java线程,该线程从EDT线程中执行您的方法: