gpt4 book ai didi

Java Swing 像素不准确

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:35 27 4
gpt4 key购买 nike

我正在使用 Swing 设计一个 Java 应用程序,但在没有布局的情况下设计 GUI 时遇到了困难。

我的目的是设计一个带有一个 JPanel 和四个 JButton 的 GUI。我已经完成了数学计算,将按钮和面板设置在正确的位置,并进行了如下编码:

import java.awt.*;
import javax.swing.*;

public class MainFrame extends JFrame {
public MainFrame() {
this.setTitle("Example Frame");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);

JPanel randomPanel = new JPanel();
randomPanel.setOpaque(true);
randomPanel.setBackground(Color.RED);
randomPanel.setBounds(10, 10, 430, 530);

JButton addButton = new JButton("Add");
addButton.setBounds(10, 550, 100, 40);
addButton.setBackground(Color.GRAY);

JButton deleteButton = new JButton("Delete");
deleteButton.setBounds(120, 550, 100, 40);
deleteButton.setBackground(Color.GRAY);

JButton refreshButton = new JButton("Refresh");
refreshButton.setBounds(230, 550, 100, 40);
refreshButton.setBackground(Color.GRAY);

JButton devButton = new JButton("Developer");
devButton.setBounds(340, 550, 100, 40);
devButton.setBackground(Color.GRAY);

this.add(randomPanel);
this.add(addButton);
this.add(deleteButton);
this.add(refreshButton);
this.add(devButton);

this.setSize(900, 600);
this.setResizable(false);
this.setVisible(true);
}

public static void main(String[] args) {
new MainFrame();
}
}

根据代码,组件预计放置如下:

Expected Form

然而,实际的表单显示如下:

Actual Form

组件超出表单,与预期外观不匹配。

这有什么问题,应该怎样做才能准确放置元件?

最佳答案

有两个主要问题......

  • setLayout(null)
  • 设置大小

您没有考虑到窗口内容的可用空间量是窗口的大小减去框架装饰。

像素完美布局是现代 UI 开发中的一种幻想,最好避免。

你可以看看:

了解更多详情。

更好的解决方案是使用一个或多个可用的布局管理器。下面的示例简单地使用 BorderLayoutGridLayout 并在 EmptyBorder 的帮助下提供一些填充

参见Laying Out Components Within a Container了解更多详情

Simple

好处

  • 适应性布局:
    • 该示例使用 pack 自动“打包”内容周围的窗口,而无需使代码适应当前运行的操作系统(或不同外观提供的框架装饰)
    • 用户可以更改窗口的大小,内容将自动调整大小 - 这对用户来说是一个好处。
    • 布局将适应用户的系统设置,因此,如果他们使用的字体大于您设计的字体,它不会完全在您面前爆炸
    • 想要添加更多按钮吗?不用担心,让自己筋疲力尽,只需添加更多按钮,布局就会自动适应,无需“像素推送”屏幕上的任何组件

可运行的示例...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

public TestPane() {
setLayout(new BorderLayout());
setBorder(new EmptyBorder(10, 10, 10, 10));
add(new SizablePane(430, 530));

JPanel buttonPane = new JPanel(new GridLayout(1, 3, 20, 0));
buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
buttonPane.add(new JButton("Add"));
buttonPane.add(new JButton("Delete"));
buttonPane.add(new JButton("Refresh"));
buttonPane.add(new JButton("Developer"));

add(buttonPane, BorderLayout.SOUTH);
}

}

public class SizablePane extends JPanel {

private Dimension size;

public SizablePane(int width, int height) {
size = new Dimension(width, height);
setBackground(Color.RED);
}

@Override
public Dimension getPreferredSize() {
return size;
}

}

}

需要添加更多按钮?简单...

JPanel buttonPane = new JPanel(new GridLayout(1, 0, 20, 0));
buttonPane.setBorder(new EmptyBorder(10, 0, 0, 0));
buttonPane.add(new JButton("Add"));
buttonPane.add(new JButton("Delete"));
buttonPane.add(new JButton("Refresh"));
buttonPane.add(new JButton("Developer"));
buttonPane.add(new JButton("Some"));
buttonPane.add(new JButton("More"));
buttonPane.add(new JButton("Buttons"));

关于Java Swing 像素不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678512/

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