双击和命令提示符时,为什么Java应用程序的行为会有所不同

时间:2013-03-18 00:10:48

标签: java swing executable-jar text-rendering

我有一个java应用程序,当通过双击jar文件在Windows中启动时,以某种方式具有不同的行为,而不是使用命令提示符启动它。

我特别注意到的行为是当我使用以下内容覆盖JLabel以更好地呈现时

 lblDate = new ATimeLabel(ATimeLabel.DATE_LETTERS) {
        private static final long serialVersionUID = 1L;

        @Override
        protected void paintComponent(Graphics g) {

            Graphics2D g2d = (Graphics2D) g;

            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                    RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                    RenderingHints.VALUE_FRACTIONALMETRICS_ON);

            super.paintComponent(g2d);
        }
    };

当我从IDE启动应用程序或从命令提示符启动jar时会出现效果但是当我双击我的应用程序时,它会显示没有paintComponent()覆盖效果的标签。

非常感谢帮助弄清楚如何在双击我的应用程序时能够产生相同的效果。

修改

我还应该提一下,在创建2个JLabel之一后添加以下字体更改

lblDate.setForeground(Color.gray);
lblDate.setFont(boldFont.deriveFont(Font.PLAIN, timeFontSize));

以下是它的外观屏幕截图。左边的那个显然有抗锯齿和干净的文字渲染我正在寻找,而右边的那个更胖,而不是那么尖锐。 (我还临时添加了红色边框以显示paint方法有效)

编辑2:

似乎当我双击JVM是1.7而我的IDE使用JDK 1.6 我不明白为什么字体的RenderingHints在Java6和Java7上看起来不一样,它们在两个API中并且没有例外地运行...

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

似乎对我来说工作得很好......

从左到右,在IDE中,从命令行双击...

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestPaintLabel {

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

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

                JLabel lblDate = new JLabel("Hello, is it me you're looking for?") {
                    private static final long serialVersionUID = 1L;

                    @Override
                    protected void paintComponent(Graphics g) {

                        Graphics2D g2d = (Graphics2D) g.create();

                        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                        g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                                RenderingHints.VALUE_RENDER_QUALITY);
                        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
                        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                                RenderingHints.VALUE_FRACTIONALMETRICS_ON);

                        super.paintComponent(g2d);
                        g2d.setColor(Color.RED);
                        g2d.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
                        g2d.dispose();

                    }

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(200, 50);
                    }

                };

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

尝试添加一些额外的绘画以确定是否实际调用了paint方法。