1

JTextFieldOSX 上の Swing アプリケーションでテキストを編集すると、テキストが文字化けします。文字を挿入または削除するときに最も顕著ですが、カーソルを移動するだけでアーティファクトが発生します。データは問題ありませんが、UI レンダリングはそうではありません。

OSX Java テキスト入力の文字化け

これは何が原因で、どうすれば修正できますか?

com.apple.laf.AquaLookAndFeelこのサンプルプログラムのように、私は を使用しています。テキストを入力し、矢印キーでカーソルを動かして、奇妙な様子を観察してください。

import java.awt.*;
import javax.swing.*;

class TextFieldDisplay {
    public static void main(String[] args) {
        MainWindow app = new MainWindow();
    }
}

class MainWindow extends JFrame {
    public MainWindow() {
        try  {
            UIManager.setLookAndFeel("com.apple.laf.AquaLookAndFeel");
        } catch(Exception e) {
            System.out.println("AquaLookAndFeel is not supported on your platform.");
            System.exit(1);
        }

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
        setMinimumSize(new Dimension(300, 100));

        JPanel innerPanel = new JPanel();
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setPreferredSize(new Dimension(250, 20));
        scrollPane.setViewportView(innerPanel);

        JPanel mainPanel = new JPanel();
        getContentPane().add(mainPanel);
        mainPanel.add(innerPanel);

        JTextField textField = new JTextField();
        textField.setPreferredSize(new Dimension(250, 20));

        innerPanel.add(textField);
        pack();
    }
}

SSCCE を書いているときに、JScrollPane.

関連性があるかどうかはわかりませんが1.6.0_51、Retina ディスプレイで Apple Java バージョンを使用しています。

4

1 に答える 1

4

2つのことが飛び出します。

まず、EDT で UI を初期化していません。次に、コンポーネントの優先サイズと最小サイズをいじっています。

コンポーネントのサイズを計算するときにフォント メトリックを考慮していないため、コンテンツのレンダリング時に問題が発生しているようです

最初にInitial Threadsを見てみましょう。

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

class TextFieldDisplay {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    //UIManager.setLookAndFeel("com.apple.laf.AquaLookAndFeel");
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception e) {
                    System.out.println("AquaLookAndFeel is not supported on your platform.");
                    System.exit(1);
                }
                MainWindow app = new MainWindow();
            }

        });
    }

}

class MainWindow extends JFrame {

    public MainWindow() {

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setVisible(true);
//        setMinimumSize(new Dimension(300, 100));

        JPanel innerPanel = new JPanel();
//        JScrollPane scrollPane = new JScrollPane();
//        scrollPane.setPreferredSize(new Dimension(250, 20));
//        scrollPane.setViewportView(innerPanel);

        JPanel mainPanel = new JPanel();
        getContentPane().add(mainPanel);
        mainPanel.add(innerPanel);

        JTextField textField = new JTextField(20);
//        textField.setPreferredSize(new Dimension(250, 20));

        innerPanel.add(textField);
        pack();
    }

}
于 2013-07-08T00:37:21.810 に答える