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

Java 当我将窗口设置为非不透明时,字体看起来像已更改,java,swing,fonts,window,blur,Java,Swing,Fonts,Window,Blur,当我将窗口设置为非不透明时,字体看起来像变了!谁能告诉我原因并帮助我,谢谢! 我猜这是受“RenderingHists.KEY_ANTIALIASING”的影响,但我用很多方法进行了测试,结果并不是我想要的结果 public static void main(String[] args) { final JFrame frame = new JFrame(); frame.setUndecorated(true); AWTUtilities.setWindowOpaque

当我将窗口设置为非不透明时,字体看起来像变了!谁能告诉我原因并帮助我,谢谢! 我猜这是受“RenderingHists.KEY_ANTIALIASING”的影响,但我用很多方法进行了测试,结果并不是我想要的结果

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);
}

这与Swing/AWT如何处理不透明和透明窗口之间的不同需求以及内部对抗锯齿所做的更改有关

例如,如果我使用

((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
要渲染文本,我可以使其在透明时以相同的方式显示

VALUE\u TEXT\u antialas\u DEFAULT
VALUE\u TEXT\u antialas\u GASP

但是,如果我使用
VALUE\u TEXT\u ANTIALIAS\u LCD\u HBGR
VALUE\u TEXT\u ANTIALIAS\u LCD\u HRGB
在两种模式下的作用都与
JLabel
相同

这些都是系统级的决策,我认为您无法(轻松)实现它们


您可能想看一看,这是一篇有趣的文章,但我不确定它会有多大帮助…

这与Swing/AWT如何处理不透明和透明窗口之间的不同要求以及内部对抗锯齿所做的更改有关

例如,如果我使用

((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
要渲染文本,我可以使其在透明时以相同的方式显示

VALUE\u TEXT\u antialas\u DEFAULT
VALUE\u TEXT\u antialas\u GASP

但是,如果我使用
VALUE\u TEXT\u ANTIALIAS\u LCD\u HBGR
VALUE\u TEXT\u ANTIALIAS\u LCD\u HRGB
在两种模式下的作用都与
JLabel
相同

这些都是系统级的决策,我认为您无法(轻松)实现它们


您可能想看看,这是一篇有趣的文章,但我不确定它会有多大帮助…

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

if (UIManager.getBoolean("MYLAF.AATextInfo.Disable")) {
    g.drawChars(data, offset, length, x, y);
    return nextX;
}
最后,在我的程序开始时,我添加了设置“UIManager.put(“MYLAF.AATextInfo.Disable”,true)”


如果不想修改SwingUtilities 2,可以使用“myJComponent.setClientProperty(AA_TEXT_PROPERTY_KEY,null)”。

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

if (UIManager.getBoolean("MYLAF.AATextInfo.Disable")) {
    g.drawChars(data, offset, length, x, y);
    return nextX;
}
最后,在我的程序开始时,我添加了设置“UIManager.put(“MYLAF.AATextInfo.Disable”,true)”


如果你不想修改SwingUtilities 2,你可以使用“myJComponent.setClientProperty(AA_TEXT_PROPERTY_KEY,null)”。

为什么你要扩展
JLabel
以任何方式只绘制文本?这只是一个例子,事实上,我的swing应用程序使用JTable。这是一个演示,仅用于解释我的问题。好的,现在我已经有了一个剧本,我明白你想做什么了…为什么你要扩展
JLabel
来只画文本?这只是一个例子,事实上,我的swing应用程序使用了JTable。这是一个演示,只用于解释我的问题。好吧,现在我有一个剧本,我明白你想做什么了…我一直在调试和跟踪我的程序,我在这里找到了关键代码:SwingUtilities2.drawString/drawChars/drawTextAntialiased。因此,我在“SwingUtilities2.drawString/drawChars”中修改了JRE的代码,我添加了如下代码:if(UIManager.getBoolean(“MYLAF.AATextInfo.Disable”){g.drawChars(data,offset,length,x,y);return nextX;}最后,在程序开始时,我添加了设置“UIManager.put”(“MYLAF.AATextInfo.Disable”,true)。我一直在调试和跟踪我的程序,我在这里找到了关键代码:SwingUtilities2.drawString/drawChars/drawTextAntialiased。因此,我在“SwingUtilities2.drawString/drawChars”中修改了JRE的代码,我添加了如下代码:if(UIManager.getBoolean(“MYLAF.AATextInfo.Disable”){g.drawChars(data,offset,length,x,y);return nextX;}最后,在程序开始时,我添加了设置“UIManager.put”(“MYLAF.AATextInfo.Disable”,true)”。