当前位置: 首页 > 知识库问答 >
问题:

Java swing UI比例

吕永嘉
2023-03-14

我需要创建一个具有接口扩展的应用程序。我有一个按钮,里面有图标和jpanel,用来固定这个按钮。问题是,当“缩放”(scale)处于启用状态时,图标会变得模糊,为了解决这个问题,我在paintComponent中使用了缩小缩放。当系统缩放打开时,我的图像正常。但JPanel仍然有一个规模。我也试图覆盖JPanel paintComponent,但结果是按钮太小,因为按钮上的downscale和JPanel上的donwscale一起工作。我不能只使用JPanel的缩放,当我点击一个按钮时,它会缩放尺寸,图像再次模糊。这是一个简单的例子。

代码是:

public class Test{

public static void main(String[] args) throws Exception{

    System.setProperty("sun.java2d.uiScale", "1.5");
    JFrame j = new JFrame();
    Image img = ImageIO.read(new File("D:\\1.png"));
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    j.setPreferredSize(new Dimension(300, 150));
    j.setVisible(true);
    j.setLocationRelativeTo(null);
    j.setLayout(new BorderLayout());

    img = img.getScaledInstance((int) (60 * 1.5),(int) (60 * 1.5),Image.SCALE_DEFAULT);

    JToggleButton tb = new JToggleButton(){
        @Override
        protected void paintComponent(Graphics g) {

            Graphics2D g2 = (Graphics2D) g;
            g2.scale(0.67,0.67);
            super.paintComponent(g2);
        }
    };
    tb.setIcon(new ImageIcon(img));

    JToggleButton tb2 = new JToggleButton(){
        @Override
        protected void paintComponent(Graphics g) {

            Graphics2D g2 = (Graphics2D) g;
            g2.scale(0.67,0.67);
            super.paintComponent(g2);
        }
    };
    tb2.setIcon(new ImageIcon(img));


    JPanel jPanel = new JPanel(){

    };
    jPanel.setLayout(new GridLayout(1,1));
    jPanel.add(tb);
    jPanel.setBackground(Color.RED);



    JPanel content = new JPanel();
    content.setLayout(new FlowLayout());
    content.add(jPanel);

    j.setContentPane(content);
    j.pack();
}

}我使用java10。谢谢你。

共有1个答案

帅博简
2023-03-14

您以1.5的比例因子渲染UI:所有UI(包括图标和图像)都被缩放,以便在高DPI显示器上正确显示。若图像不能缩放,那个么对于较高的DPI设置来说,它将太小。

如果应用程序支持高DPI显示,即用户界面缩放,则应提供不同分辨率的图像。请参阅Java 9中的MultiResolutionImage。

您可以在此相关问题的答案中找到示例代码。

 类似资料:
  • 我在 SO 上发现了一些关于性能比较的问题 我为比较编写了一个程序(不太好使…复制到您的机器上运行它),其中我为(int i=0; i创建了两个循环

  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 问题内容: Comparable和Comparator之间的主要区别是什么。 在什么情况下,哪个比另一个优先? 问题答案: 当你的类实现时,该类的方法将定义该对象的“自然”顺序。根据合同,该方法有义务(尽管不要求)与该对象上的其他方法保持一致,例如,当比较返回true 时,应始终为对象返回0 。 一个比较本身就是如何比较两个对象的定义,可用于可能不与自然顺序排列的方式来比较的对象。 例如,字符串通

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 我的任务是用java编写mergesort,任务还规定我不能使用整数,我必须使用可比较的整数。这是我第一次使用java。我的问题是在合并函数内比较两个comp int数组中的元素。我尝试了if(list[I])compareTo(list2[j]),但compareTo只能取整数。任何帮助都将不胜感激

  • Snowpack Snowpack 也是一个与 Vite 十分类似的非构建式原生 ESM 开发服务器。除了不同的实现细节外,这两个项目在技术上比传统工具有很多共同优势。Vite 的依赖预绑定也受到了 Snowpack v1(现在是 esinstall)的启发。这两个项目之间的一些主要区别是: 生产构建 Snowpack 的默认构建输出是未打包的:它将每个文件转换为单独的构建模块,然后将这些模块提供

  • 比较两个输入的大小 用法 Your browser does not support the video tag. 案例:小台灯 功能:当随机数A>B时,灯亮;当随机数A<B时灯灭 工作原理 在配置面板中设置操作符(>,<,=),将两个数值连接到节点的输入端。如果满足比较条件,结果将输出YES。否则将输出NO。

  • 比较输入的数值与原来的数值。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:00:00后,响起猫叫声小闹钟 工作原理 输入的值将用来被比较。如果这个值满足条件,那么这个节点将会输出“yes”;否则,输出“no”。 提示: 如果输入的是一个字符串,节点会尝试将它转化为数字;如果失败,将会输出“no” 如果输入的是一个对象