我意识到这是一个重复的问题,但是我的情况略有不同。我需要在另一个类中增加一个MouseListener,该类可以使调用它的对象的背景色变高。请帮助我。
public class LeftListPanel extends JPanel {
public LeftListPanel() {
setBackground(Settings.BACKGROUND_COLOR);
setLayout(null);
addPersonalStatsTab();
}
private void addPersonalStatsTab() {
JPanel personalStatsPanel = new JPanel();
personalStatsPanel.addMouseListener(new CustomMouseListener());
JLabel personalStatsText = new JLabel("Text");
personalStatsPanel.add(personalStatsText);
add(personalStatsPanel);
}
然后我为MouseListener提供了一个内部嵌套的类,因为这是将调用此MouseListener的唯一位置。
class CustomMouseListener implements MouseListener {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
setBackground(Settings.BACKGROUND_COLOR.brighter());
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(Settings.BACKGROUND_COLOR);
}
}
setBackground(COLOR)行是不起作用的... this.setBack和super.setBack在这种情况下不起作用。.我非常希望获得帮助!
答案 0 :(得分:0)
看不到背景变化的原因是,当您调用this
时,您将取消(隐式)引用LeftListPanel
对象,即addPersonalStatsTab
的实例。因此,您实际上是在更改其背景,但您看不到它,因为在LeftListPanel实例内部还有另一个JPanel(在null
方法处实例化),它占据了整个可见空间(甚至根本不可见,因为null
的布局很奇怪;我不清楚)。
首先,我建议您不要将setLayout(null)
设置为布局。选择合适的布局,或将其设置为默认布局-不要调用personalStatsPanel
。
然后,将LeftListPanel
设置为setBackground
的私有成员。并在调用 LeftListPanel.this.personalStatsPanel.setBackground(...);
时,将其用作范围参考:
/* width */
::-webkit-scrollbar {
width: 20px;
}
/* Track */
::-webkit-scrollbar-track {
box-shadow: inset 0 0 5px blue;
border-radius: 10px;
}
/* Handle */
::-webkit-scrollbar-thumb {
background: yellow;
border-radius: 10px;
}
/* Handle on hover */
::-webkit-scrollbar-thumb:hover {
background: green;
}
.slider {
width: 100%;
height: auto;
display: flex;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;
}
.img {
flex-shrink: 0;
max-width: 100%;
height: 100%;
}
答案 1 :(得分:0)
这有效,我只是创建了一个私有方法,在我要应用的面板中进行传递。
private void CustomMouseListener(JPanel panel) {
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
}
@Override
public void mouseExited(MouseEvent e) {
panel.setBackground(Settings.BACKGROUND_COLOR);
}
});
}
感谢大家的时间和建议:)
答案 2 :(得分:0)
将要更改的组件的引用传递到CustomMouseListener
class CustomMouseListener implements MouseListener {
private JPanel panel;
public CustomMouseListener(JPanel panel) {
this.panel = panel;
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
}
@Override
public void mouseExited(MouseEvent e) {
panel.setBackground(Settings.BACKGROUND_COLOR);
}
}
如果要在有限数量的组件上使用侦听器,这是可以的,但是如果要在多个组件上使用相同的侦听器,则可以...
使用source
的{{1}}属性获取触发事件的组件
MouseEvent
或者,更好的解决方案是做更多类似的事情...
@Override
public void mouseEntered(MouseEvent e) {
if (!(e.getSource() instanceof JPanel)) {
return;
}
JPanel panel = (JPanel)e.getSource();
panel.setBackground(Settings.BACKGROUND_COLOR.brighter());
}
由于已经向您提供了信息(只是没有提供,所以它返回@Override
public void mouseEntered(MouseEvent e) {
e.getComponent().setBackground(Settings.BACKGROUND_COLOR.brighter());
}
的一个实例,因此,如果您需要访问Swing的特定属性,则仍然需要对其进行强制转换)。
为什么这种方法更好?
Component
因为它是不可知的,这意味着您可以创建侦听器的单个实例并在多个组件上重复使用