【问题标题】:How do I return a swing event if it not used?如果没有使用,如何返回摇摆事件?
【发布时间】:2014-09-10 03:55:27
【问题描述】:

文本在JPanels 内,它们都在JScrollPane 内。我已设置捕捉MouseWheelEvent(滚动),因此当按下Ctrl 键并转动鼠标滚轮时,文本将放大/缩小(字体大小增加/减少)。这导致无法再滚动字体列表,除非我将鼠标光标直接指向滚动条。我想知道当Ctrl 键未被按下时是否有办法return 事件。那可能吗?我查看了MouseWheelEvent api 并没有发现任何有用的东西。谷歌搜索也没有给我任何东西。

【问题讨论】:

  • 并非如此,MouseListeners 通常是这样工作的。您可以尝试在父组件上调用Component#dispatchEvent,但您需要尝试找出哪个父组件想要响应事件...
  • for (instanceof) TextComponent 放在JPanel 中使用Component c = SwingUtilities.getDeepestComponentAt( e.getComponent(), e.getX(), e.getY()); 缩放从KeyBindings 映射到Ctrl_pressed + mouseWheelMoved,别忘了测试@ 987654338@,最后一行代码应该是myDeepestComponentAt.repaint()

标签: java swing event-handling mouseevent


【解决方案1】:

如果我确实正确理解了您,那么您正在寻找的答案应该是这样的主要思想,即为您的表单和滚动窗格创建不同的鼠标滚轮事件。观看整个动画你会发现你的问题已经解决了,你可以根据这个想法进行操作

您应该在您的字段中添加以下内容;

     public int defaultTextSize = 12;
     boolean ctrlcheck =false;

这是 jLabel4 来显示构造函数中没有按下 CTRL

   jLabel4.setText("CTRL IS NOT PRESSED");

你的滚动鼠标事件应该是这样的

  private void jScrollPane1MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {                                             

int notches = evt.getWheelRotation();

if (notches < 0) {            
    if (ctrlcheck == true) {
        defaultTextSize = defaultTextSize + 3;
        Font zoomfont = new Font("Monospaced", Font.PLAIN, defaultTextSize);
        jLabel1.setFont(zoomfont);
        jLabel2.setFont(zoomfont);
        jLabel3.setFont(zoomfont);
        jLabel1.repaint();
        jLabel2.repaint();
        jLabel3.repaint();

    } else {

        System.out.println("CTRL IS NOT PRESSED");

    }
} else {
    if (ctrlcheck == true) {
        defaultTextSize = defaultTextSize - 3;
        Font zoomfont2 = new Font("Monospaced", Font.ITALIC, defaultTextSize);

        jLabel1.setFont(zoomfont2);
        jLabel2.setFont(zoomfont2);
        jLabel3.setFont(zoomfont2);
        jLabel1.repaint();
        jLabel2.repaint();
        jLabel3.repaint();
    }

}


  } 

你需要这样的 FORM Key Released Event

private void formKeyReleased(java.awt.event.KeyEvent evt) {                                 

    jLabel4.setText("CTRL IS  NOT PRESSED");
    ctrlcheck = false;


}  

formMouseWheelMoved 需要单独的事件

private void formMouseWheelMoved(java.awt.event.MouseWheelEvent evt) {                                     

int notches = evt.getWheelRotation();

if (notches < 0) {            
    if (ctrlcheck == true) {
        defaultTextSize = defaultTextSize + 3;
        Font zoomfont = new Font("Monospaced", Font.PLAIN, defaultTextSize);
        jLabel1.setFont(zoomfont);
        jLabel2.setFont(zoomfont);
        jLabel3.setFont(zoomfont);
        jLabel1.repaint();
        jLabel2.repaint();
        jLabel3.repaint();

    } else {

        System.out.println("CTRL IS NOT PRESSED");

    }
} else {
    if (ctrlcheck == true) {
        defaultTextSize = defaultTextSize - 3;
        Font zoomfont2 = new Font("Monospaced", Font.ITALIC, defaultTextSize);

        jLabel1.setFont(zoomfont2);
        jLabel2.setFont(zoomfont2);
        jLabel3.setFont(zoomfont2);
        jLabel1.repaint();
        jLabel2.repaint();
        jLabel3.repaint();

      }   
   }   
}  

您还需要 Form Keypressed Event 来检查按键是否仍被按下

 private void formKeyPressed(java.awt.event.KeyEvent evt) {                                

int key = evt.getKeyCode();
if (key == KeyEvent.VK_CONTROL) {

    jLabel4.setText("CTRL IS  PRESSED");
    ctrlcheck = true;

}
}  

【讨论】:

    【解决方案2】:

    我使用了@MadProgrammer 的评论并从@okrman 的回答中得到了一些想法,并想出了一个更好的方法来做到这一点。在我的解决方案中,我不需要添加两个单独的事件侦听器,即一个到JLabel,另一个到JScrollPane。我在JLabel 上只使用了一个事件监听器。这里的主要关键是@MadProgrammer 提到的Component#dispatchEvent。我刚刚发现(从我模糊的记忆中记得)一个很好的方法来在 JLabel 中获取父 JScrollPane

    当然,我这里给出的例子只是一个例子。我没有设置任何组件的宽度或高度。这个例子的灵魂目的只是为了展示问题是如何解决的。

    public class ParentScrollPane extends JScrollPane {
      public ParentScrollPane() {
        JPanel textContainer = new JPanel();
    
        // I have multiple labels in a for loop, this is
        // just an example
        JLabel sLabel = new JLabel("SOME LABEL TEXT");
        sLabel.setParent(thisPane);
        textContainer.add(sLabel);
    
        setViewportView(textContainer);
      }
    
      // this interface is important and key to the solution
      public interface ParentSetter {
        public void setParent(Component p);
      }
    
      private JScrollPane thisPane;
    }
    
    public class CustomLabel extends JLabel implements ParentScrollPane.ParentSetter {
      public CustomLabel(String text) {
        super(text);
    
        // one event listener is suffice
        addMouseWheelListener(new MouseWheelListener() {
          @Override
          public void mouseWheelMoved(MouseWheelEvent e) {
            // if the Ctrl key is down
            if (e.isControlDown()) {
              // then zoom the font in the JLabel
            } else {
              // then scroll the parent scroll pane
              labelParent.dispatchEvent(e);
            }
          }
        });
      }
    
      // pay very close attention to this and
      // how the parent scroll pane is set here
      @Override
      public void setParent(Component lParent) {
        labelParent = lParent;
      }
    
      private Component labelParent;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多