- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用 JLayer
包装一个 JButton
以向其添加一些效果/功能。当我用工具栏中的包装器替换按钮时,它会出于某种原因绘制按钮边框。工具栏已将翻转设置为 true
。
为什么会发生这种情况,我该如何预防?
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.LayerUI;
public class JLayerButton extends JFrame {
private JToolBar toolbar;
private JButton button1;
private JButton button2;
private JButton button3;
public JLayerButton() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("JLayer Button");
setLayout(new BorderLayout());
toolbar = new JToolBar();
toolbar.setFloatable(false);
toolbar.setRollover(true);
getContentPane().add(toolbar, BorderLayout.NORTH);
button1 = new JButton("One");
button1.setFocusable(false);
toolbar.add(button1);
button2 = new JButton("Two");
button2.setFocusable(false);
toolbar.add(button2);
button3 = new JButton("Three");
button3.setFocusable(false);
toolbar.add(button3);
// wrap button2 in JLayer
int componentIndex = toolbar.getComponentIndex(button2);
JButtonLayerUI layerUI = new JButtonLayerUI();
JLayer<JButton> layer = new JLayer<JButton>(button2, layerUI);
layer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
layer.setFocusable(false);
toolbar.add(layer, componentIndex);
setSize(300, 200);
setLocationRelativeTo(null);
}
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException,
IllegalAccessException, UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JLayerButton().setVisible(true);
}
});
}
private static class JButtonLayerUI extends LayerUI<JButton> {
public JButtonLayerUI() {
}
@Override
public void paint(Graphics g, JComponent c) {
super.paint(g, c);
}
@Override
protected void processMouseEvent(MouseEvent e, JLayer<? extends JButton> l) {
onMouseEvent(l, e);
}
@Override
protected void processMouseMotionEvent(MouseEvent e, JLayer<? extends JButton> l) {
onMouseEvent(l, e);
}
private void onMouseEvent(JLayer<? extends JButton> l, MouseEvent e) {
System.out.println(e);
}
}
}
最佳答案
使用 JLayer
似乎无法实现您想要实现的目标,因为:
从BasicToolBarUI
的代码中,我们可以看到那些调用
installRolloverBorders
被调用以在 JToolBar
上安装边框:
public void setRolloverBorders( boolean rollover ) {
rolloverBorders = rollover;
if ( rolloverBorders ) {
installRolloverBorders( toolBar );
} else {
installNonRolloverBorders( toolBar );
}
}
installRolloverBorders
在工具栏的每个直接 JComponent
子项(非递归)上调用setBorderToRollover
protected void installRolloverBorders ( JComponent c ) {
// Put rollover borders on buttons
Component[] components = c.getComponents();
for (Component component : components) {
if (component instanceof JComponent) {
((JComponent) component).updateUI();
setBorderToRollover(component);
}
}
}
最后,setBorderToRollover
仅适用于 AbstractButton
的实例,而您的 JLayer
不是。因此,您的 JLayer 按钮的原始边框根本不受影响。
protected void setBorderToRollover(Component c) {
if (c instanceof AbstractButton) {
AbstractButton b = (AbstractButton)c;
Border border = borderTable.get(b);
if (border == null || border instanceof UIResource) {
borderTable.put(b, b.getBorder());
}
// Only set the border if its the default border
if (b.getBorder() instanceof UIResource) {
b.setBorder(getRolloverBorder(b));
}
rolloverTable.put(b, b.isRolloverEnabled()?
Boolean.TRUE: Boolean.FALSE);
b.setRolloverEnabled(true);
}
}
总而言之,翻转 效果仅适用于满足这两个条件的组件:
JToolBar
的直接子级AbstractButton
的一个实例您可能可以推出自己的 BasicToolBarUI
版本并覆盖一些方法以添加递归性,例如,看看是否值得花时间。
关于java - 用 JLayer 装饰滚动工具栏按钮绘制其边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37295099/
如何在jlayer中停止MP3? (stop() 不再使用) 我的代码如下: //main class mp3_main private AdvancedPlayer player;
我刚刚开始使用 Jlayer 库来播放 MP3。它工作得很好,我可以播放这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让播放 MP3 的线程等待,声音会停止,为了恢复歌曲,
我对 jLayer 有疑问。我有一个带有开始播放歌曲代码的按钮: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt
我注意到很多主题都是关于使用 JLayer 暂停/恢复 MP3 的,所以为了帮助大家,我专门为此设计了一个完整的类(class)!请参阅下面的答案。 注意:这是供我个人使用的,因此它可能不像某些人希望
我和一个 friend 正在将 MP3 播放器编程作为学校项目。我们即将完成,现在陷入了尝试编写一个函数来改变播放器音量的阶段。我们正在使用: 音频设备 高级玩家 我知道其他人已经问过同样的问题,但我
我一直在测试一个可以在 PC 和 Android 平台上运行的 Java 库,前段时间有人告诉我使用 JLayer。今天我正在愉快地编码,然后出现了这个异常: java.lang.ExceptionI
由于某种原因,每个图像仅显示 1/5(或更少)。由于它是分层 Pane ,因此至少应完全显示 1 个。布局为空,因为这是一个学习程序为什么会发生这种情况? 代码如下:类测试1 import javax
我想在图像上放置一个网格。我使用了一个使用 paintComponent 方法保存图像的 JLabel,我使用这个方法是因为在我的项目和 JLayer GridLayer; JLabel im
我的音乐播放器项目中的 JLayer 有一个非常具体的问题。我想包括一些东西来调整音量,但似乎不太容易实现。 这是因为 JLayer 本身不支持它。我从我的项目中排除了 Player 类并更改了一些方
您好,我想降低音量播放声音。我用了jl1.0.1让它发挥作用。我正在搜索如何控制音量,这就是我使用的代码 public static void playSound(String name){
我需要知道我应该使用什么来控制我使用 jLayer 创建的 MP3 播放器的音量?我可以使用哪些 API 或方法来控制 mp3 文件的音量? 最佳答案 public class VolumeSli
我正在尝试用 JLayer 包装一个 JButton 以向其添加一些效果/功能。当我用工具栏中的包装器替换按钮时,它会出于某种原因绘制按钮边框。工具栏已将翻转设置为 true。 为什么会发生这种情况,
我在 Clojure 中编写了几百行应用程序,这些应用程序使用 JLayer Java 库作为我在后台运行 mp3 的音频。这工作正常,但只要我在后台运行任何其他音乐、YouTube 等(我正在运行
我有一个线程来播放音频,但是当我关闭表单时,我想停止播放器播放音频文件,我的线程运行方法是: public static Player playplayer; public static FileIn
我正在使用 jLayer 1.0 来播放一个简单的 mp3 文件。除了前 3 秒左右,它工作正常(在轨道开头添加 5 秒的静音解决了这个问题)。这是我正在使用的代码: try { final
正在关注 Oracle's Myopia guide ,我有一个简单的 JPanel,它作为 JLayer 添加到 JFrame。很简单,这模糊了 JPanel 的组件。但是,我正在尝试在此 JPan
我正在使用 JLayer 解码 MP3,并将其存储为 PCM 数据。但是,无论我使用什么 MP3 文件,我总是会收到索引为 443 的 ArrayIndexOutOfBoudnsException。我
我正在尝试将图像背景设置在 3 个 JButton 后面。截至目前,它正在绘制背景,然后将按钮放在没有背景的下方(拉伸(stretch)窗口以查看)。我将如何使用 JLayeredPane 将背景图像
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我想在用户输入无效时绘制一个图标。我找到了 Oracle 的示例并根据我的目的对其进行了修改。图标的绘制工作正常,但是当我更改值以更正图标时,图标不会完全不可见:在 JPanel 上绘制的部分仍然显示
我是一名优秀的程序员,十分优秀!