3

コマンドプロンプトを使用して起動する場合とは異なり、jarファイルをダブルクリックしてWindowsで起動した場合の動作が異なるJavaアプリケーションがあります。

私が特に気付いている動作は、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));

これがその様子のスクリーンショットです。左側のものは明らかに私が探しているアンチエイリアシングとクリーンなテキストレンダリングを持っていますが、右側のものは太くてシャープではありません。(また、ペイント方法が有効であることを示すために、一時的に赤い境界線を追加しました)

編集2:

JVMが1.7で、IDEがJDK 1.6を使用している場合、フォントのRenderingHintsがJava6とJava7で同じように表示されない理由がわかりません。どちらのAPIでも、例外なく実行されます...

どんな助けでもいただければ幸いです。

4

1 に答える 1

1

私にとってはうまくいくようです...

左から右へ、IDE で、コマンド ラインから、ダブルクリックして...

ここに画像の説明を入力

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メソッドが実際に呼び出されたかどうかを判断するために、追加の描画を追加してみてください。

于 2013-03-18T00:39:43.233 に答える