出现问题:1.鼠标放到标题栏会高亮,放到按钮上没有高亮;2.标题栏依旧没有下划线;3.最大化后鼠标拖动窗口时,窗口只会缓慢移动.
时间: 2024-04-16 15:28:37 浏览: 145
抱歉,我之前的回答中有一些错误。让我来纠正这些问题:
1. 按钮没有高亮:这是因为按钮的默认触发事件是鼠标点击,而不是鼠标悬停。要实现按钮高亮效果,我们需要添加鼠标进入和离开的事件监听器。在 `createTitleBarButton()` 方法中,为每个按钮添加鼠标监听器,将按钮的背景色设置为高亮颜色。
2. 标题栏下划线:我之前的回答中漏掉了设置标题栏下划线的代码。你可以在 `createTitleBar()` 方法中添加以下代码来创建下划线边框:
```java
// 创建下划线边框
MatteBorder underlineBorder = new MatteBorder(0, 0, 1, 0, Color.WHITE);
titleBar.setBorder(underlineBorder);
```
3. 最大化后窗口移动缓慢:这是因为在鼠标拖动窗口时,我们没有正确计算窗口的新位置。在 `mouseDragged()` 方法中,我们应该使用 `getExtendedState()` 方法来判断窗口是否处于最大化状态,并相应地调整窗口的位置。
请将以下修正后的代码添加到之前的代码中:
```java
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.MatteBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class CustomWindow extends JFrame {
private JPanel titleBar;
private Point initialClick;
public CustomWindow() {
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setUndecorated(true); // 去掉窗口边框默认样式
// 创建标题栏
createTitleBar();
getContentPane().setBackground(Color.WHITE); // 设置窗口背景色为白色
setVisible(true);
}
private void createTitleBar() {
// 创建标题栏面板
titleBar = new JPanel();
titleBar.setBackground(Color.WHITE);
titleBar.setPreferredSize(new Dimension(getWidth(), 30));
// 创建下划线边框
MatteBorder underlineBorder = new MatteBorder(0, 0, 1, 0, Color.WHITE);
titleBar.setBorder(underlineBorder);
// 添加最小化按钮
JButton minimizeButton = createTitleBarButton("-");
minimizeButton.addActionListener(e -> setState(JFrame.ICONIFIED));
minimizeButton.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
minimizeButton.setBackground(new Color(200, 200, 200));
}
public void mouseExited(MouseEvent e) {
minimizeButton.setBackground(Color.WHITE);
}
});
// 添加最大化/还原按钮
JButton maximizeButton = createTitleBarButton("□");
maximizeButton.addActionListener(e -> {
if (getExtendedState() == JFrame.MAXIMIZED_BOTH) {
setExtendedState(JFrame.NORMAL);
} else {
setExtendedState(JFrame.MAXIMIZED_BOTH);
}
});
maximizeButton.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
maximizeButton.setBackground(new Color(200, 200, 200));
}
public void mouseExited(MouseEvent e) {
maximizeButton.setBackground(Color.WHITE);
}
});
// 添加关闭按钮
JButton closeButton = createTitleBarButton("✕");
closeButton.addActionListener(e -> {
dispose();
System.exit(0);
});
closeButton.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
closeButton.setBackground(new Color(200, 200, 200));
}
public void mouseExited(MouseEvent e) {
closeButton.setBackground(Color.WHITE);
}
});
// 添加按钮到标题栏
titleBar.setLayout(new FlowLayout(FlowLayout.RIGHT));
titleBar.add(minimizeButton);
titleBar.add(maximizeButton);
titleBar.add(closeButton);
// 添加鼠标监听器以实现拖动窗口功能
titleBar.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
initialClick = e.getPoint();
getComponentAt(initialClick);
}
});
titleBar.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
int thisX = getLocation().x;
int thisY = getLocation().y;
int xMoved = e.getX() - initialClick.x;
int yMoved = e.getY() - initialClick.y;
int x = thisX + xMoved;
int y = thisY + yMoved;
if (getExtendedState() == JFrame.MAXIMIZED_BOTH) {
setExtendedState(JFrame.NORMAL);
setLocation(x - xMoved, y - yMoved);
} else {
setLocation(x, y);
}
}
});
// 将标题栏面板添加到窗口的顶部
getContentPane().add(titleBar, BorderLayout.NORTH);
}
private JButton createTitleBarButton(String text) {
JButton button = new JButton(text);
button.setFocusPainted(false);
button.setBackground(Color.WHITE);
button.setBorder(null);
button.setPreferredSize(new Dimension(30, 30));
return button;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
CustomWindow window = new CustomWindow();
});
}
}
```
这些修正后的代码添加了鼠标监听器以实现按钮的高亮效果,创建了标题栏的下划线边框,并修复了最大化后窗口移动的问题。
希望这个修正后的代码能够解决你的问题!
阅读全文