首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我将窗口设置为非不透明时,字体看起来已更改。

当我将窗口设置为非不透明时,字体看起来已更改。
EN

Stack Overflow用户
提问于 2013-12-19 01:59:58
回答 2查看 210关注 0票数 1

当我把窗口设置为非透明的时候,字体看起来变了!谁能告诉我为什么,帮助我,谢谢!我猜这是受"RenderingHints.KEY_ANTIALIASING“的影响,但我测试了很多方面,这不是我想要的结果。

代码语言:javascript
复制
public static void main(String[] args) {
    final JFrame frame = new JFrame();
    frame.setUndecorated(true);
    AWTUtilities.setWindowOpaque(frame, false);
    JPanel mainPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 20, 10));
    mainPanel.add(new JLabel("Why this changed?"));
    JLabel lbl2 = new JLabel() {
        @Override
        public void paint(Graphics g) {
            // super.paint(g);
            // ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.drawString("There is no change", 0, 15);
        }
    };
    lbl2.setPreferredSize(new Dimension(240, 22));
    mainPanel.add(lbl2);
    JPanel toolPanel = new JPanel(new FlowLayout());
    final JCheckBox ckxWindowOpaque = new JCheckBox("WindowOpaque");
    ckxWindowOpaque.setSelected(!AWTUtilities.isWindowOpaque(frame));
    ActionListener al = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            boolean b = AWTUtilities.isWindowOpaque(frame);
            if (b == !ckxWindowOpaque.isSelected()) return;
            if (b) {
                AWTUtilities.setWindowOpaque(frame, false);
            } else {
                AWTUtilities.setWindowOpaque(frame, true);
            }
        }
    };
    ckxWindowOpaque.addActionListener(al);
    toolPanel.add(ckxWindowOpaque);
    toolPanel.add(new JButton(new AbstractAction("Exit") {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }));
    frame.getContentPane().add(toolPanel, BorderLayout.NORTH);
    frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
    ((JComponent) frame.getContentPane()).setBorder(BorderFactory.createLineBorder(Color.black));
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setBounds(200, 200, 200, 200);
    frame.setVisible(true);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-20 02:30:08

我一直在调试和跟踪我的程序,我找到了关键代码here:SwingUtilities2.drawString/drawChars/drawTextAntialiased.。因此,我在“SwingUaryties2.DrawString/drawChars”中修改了JRE的代码,我添加了如下代码:

代码语言:javascript
复制
if (UIManager.getBoolean("MYLAF.AATextInfo.Disable")) {
    g.drawChars(data, offset, length, x, y);
    return nextX;
}

最后,在我的程序开始时,我添加了设置"UIManager.put("MYLAF.AATextInfo.Disable",true)“。

如果不修改"myJComponent.setClientProperty(AA_TEXT_PROPERTY_KEY,,则可以使用SwingUtilities2 )“。

票数 1
EN

Stack Overflow用户

发布于 2013-12-19 02:15:53

这将与Swing/AWT如何处理不透明和透明窗口与内部对反混叠的更改之间的不同需求有关。

例如,如果我使用

代码语言:javascript
复制
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

为了渲染文本,我可以让它在透明的情况下以相同的方式呈现

我也从VALUE_TEXT_ANTIALIAS_DEFAULTVALUE_TEXT_ANTIALIAS_GASP得到了同样的结果

但是,如果我使用VALUE_TEXT_ANTIALIAS_LCD_HBGRVALUE_TEXT_ANTIALIAS_LCD_HRGB,它在这两种模式中的作用都将与JLabel相同。

这些都是系统级别的决策,我不认为您可以(很容易)影响它们。

您可能想看看液晶文本:条纹上的反混叠,这是一个有趣的阅读,但我不确定它会有多大帮助……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20672141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档