文本位于JPanels
内,且全部位于JScrollPane
内。我已设置捕捉MouseWheelEvent
(滚动),因此当按下Ctrl
键并且转动鼠标滚轮时,文本将放大/缩小(字体大小增加/减少)。这导致无法再滚动字体列表,除非我将鼠标光标直接指向滚动条。我想知道return
密钥未被按下时是否有Ctrl
事件的方法。那可能吗?我浏览了MouseWheelEvent
api并没有找到任何有用的东西。谷歌搜索也没有给我任何东西。
答案 0 :(得分:5)
如果我确实理解了您正在寻找的答案应该是这样的主要想法,为您的表单和滚动窗格创建不同的鼠标滚轮事件。观看整个动画,您将看到问题已修复,您可以根据这个想法进行操作
您应在下方添加字段;
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;
}