如果不使用,我如何返回挥杆事件?

时间:2014-09-10 03:55:28

标签: java swing event-handling mouseevent

enter image description here

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

2 个答案:

答案 0 :(得分:5)

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

enter image description here

您应在下方添加字段;

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

      }   
   }   
}  

您还需要表单按键事件以检查按键是否仍然按下

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

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

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

}
}  

答案 1 :(得分:0)

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

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

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