2013-07-07 3 views
1

Когда я редактирую текст в JTextField в моем приложении Swing на OSX, текст становится искаженным. Это наиболее заметно, когда я вставляю или удаляю символы, но есть артефакты только при перемещении курсора. Данные в порядке, но визуализация пользовательского интерфейса не является.Опечатанный текст в текстовом поле OSX Java

Garbled text in OSX Java text input

Каковы причины этого и как я могу это исправить?

Я использую 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.

Не уверен, что это актуально, но я использую версию Apple Java 1.6.0_51 с дисплеем сетчатки.

+0

Рассмотрите возможность создания и публикации [минимальной тестовой программы] (http://sscce.org), также известной как sscce, которую мы можем запускать, тестировать, изменять и исправлять. –

+0

Пожалуйста, разместите небольшой пример кода, который демонстрирует проблему (A [SSCCE] (http://sscce.org/)), в противном случае все, что может сделать, это догадываться. –

+1

какой внешний вид вы используете? – nachokk

ответ

4

Две вещи выпрыгивают на меня.

Во-первых, вы не используете свой пользовательский интерфейс в EDT, во-вторых, вы возитесь с предпочтительными и минимальными размерами ваших компонентов.

Вы не принимая во внимание метрики шрифта при расчете размера ваших компонентов, которые, кажется, вызывают проблемы, когда он делает содержание

Начните с взглянуть на 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(); 
    } 

} 
+0

Не следует ли устанавливать L & F в главном меню перед вызовом 'EventQueue.invokeLater (....)'? –

+0

Возможно, скопируйте и вставьте: P – MadProgrammer

+0

@MadProgrammer Спасибо за объяснение и пример. Я использую 'set * Size()', так как ScrollPane рушится и скрывает компоненты внутри него, хотя это может быть побочным эффектом моего слабого опыта Swing. – cbednarski

Смежные вопросы