gpt4 book ai didi

java - Swing 窗口在 Windows 和 Linux 中任意添加边距,但在 Mac 上不行

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:54 26 4
gpt4 key购买 nike

对于一个学校项目,我必须用 Java 制作一个图书馆管理应用程序。由于 Reeder for Mac 最近问世,我想我可能会尝试使用未修饰的窗口重新创建界面(请参阅此处的示例 http://cl.ly/3VAn )。

经过多次尝试,我终于掌握了在 Mac 上工作的基础。图像请访问http://cl.ly/3VNU/ScreenshotMac.png

但是在 Windows 和 Ubuntu 中我得到了这个奇怪的余量。图像请访问http://cl.ly/3V4I/ScreenshotLinux.png

该窗口是一个带有三个 JPanel 的 JFrame,这些 JPanel 的 PaintComponent 被覆盖。这是编译后的.jar,http://cl.ly/3VCG自己尝试一下。如果您认为需要源代码,这里是 http://cl.ly/3VSz

提前致谢!

最佳答案

需要注意的几点:

  1. 两个面板只需要一个鼠标处理程序。由于这可能不必要地使工具栏中的事件处理变得复杂,因此我会让操作系统进行装饰。

  2. 您应该本地化您的背景绘图。

  3. 您可以根据需要使用 setPreferredSize() 并重写 getPreferredSize()

  4. 您的 main() 方法应在“on the event dispatch thread. ”上构建 GUI

  5. JFrame 的默认布局是 BorderLayout,组件之间没有间隙。

以下示例表明了一些原则:

public class WelcomeWindow extends JFrame {

private ToolPanel top = new ToolPanel("/guiresources/BgTop.png");
private PaperPanel middle = new PaperPanel("/guiresources/BgPaper.png");
private ToolPanel bottom = new ToolPanel("/guiresources/BgBottom.png");

public WelcomeWindow() throws IOException {
initComponents();
}

private void initComponents() throws IOException {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setUndecorated(true);

middle.setPreferredSize(new Dimension(640, 480));
this.add(top, BorderLayout.NORTH);
this.add(middle, BorderLayout.CENTER);
this.add(bottom, BorderLayout.SOUTH);

MouseHandler mouseHandler = new MouseHandler();
top.addMouseListener(mouseHandler);
top.addMouseMotionListener(mouseHandler);
bottom.addMouseListener(mouseHandler);
bottom.addMouseMotionListener(mouseHandler);

this.pack();
this.setLocationRelativeTo(null);
}

private class MouseHandler extends MouseAdapter {

private Point point = new Point();

@Override
public void mousePressed(MouseEvent e) {
point.x = e.getX();
point.y = e.getY();
}

@Override
public void mouseDragged(MouseEvent e) {
Point p = getLocation();
setLocation(p.x + e.getX() - point.x, p.y + e.getY() - point.y);
}
}
}

class PaperPanel extends JPanel {

protected Image image;

PaperPanel(String name) {
try {
image = ImageIO.read(getClass().getResource(name));
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
}

class ToolPanel extends PaperPanel {

ToolPanel(String name) {
super(name);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(image.getWidth(null), image.getHeight(null));
}
}

关于java - Swing 窗口在 Windows 和 Linux 中任意添加边距,但在 Mac 上不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com