Подтвердить что ты не робот

Неверные границы Java 1.8

У меня возникают проблемы с границами swing после перехода с Java 1.7 на Java 1.8:

На всех моих кнопках мне нужен сплошной фоновый цвет и сплошная граница, поэтому я определил, что через UIManager. На Java 1.7 и предыдущих версиях все выглядит хорошо, но на Java 1.8 граница все испортилась. Также RadioButton выглядит очень странно и неровно. У CheckBoxes также есть проблема.

Для демонстрации я создал короткий образец с несколькими компонентами:

import java.awt.Color;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.UIManager;

public class CompDemo extends JFrame
{

    public CompDemo()
    {

        setLayout(new FlowLayout());

        add(new JButton("button"));
        add(new JTextField("txt"));
        add(new JComboBox<String>());
        add(new JRadioButton("radio"));
        add(new JToggleButton("toggle"));
        add(new JCheckBox("check"));

        pack();
        setVisible(true);

    }

    public static void main(String[] args)
    {
        UIManager.put("Button.background", Color.LIGHT_GRAY);
        UIManager.put("Button.border", BorderFactory.createCompoundBorder(BorderFactory
            .createLineBorder(Color.RED), BorderFactory.createLineBorder(Color.CYAN)));

        new CompDemo();

    }

}

Здесь вы можете увидеть выходные данные с различными версиями JDK (до 200% без сглаживания): Первая из них - Java 7u60 и отображает все правильное. На втором снимке я обвел эти различия. Третий - с Java 8u11, и, как вы видите, границы довольно перепутаны (и стрелка вниз также выглядит странно).

http://imgur.com/K4df1Lg

Я использовал голубой LineBorder внутри красного LineBorder, чтобы вы могли видеть проблему более четко.

Моя ОС - это Windows 8 x64, если это имеет значение.

Может ли кто-нибудь сказать мне, почему это выглядит так на Java 8? Я что-то пропустил или действительно испортил границы в Java 1.8? Должен ли я записывать сообщение об ошибке? Или есть только несколько настроек, которые нужно сделать, чтобы снова выглядеть хорошо?

Спасибо, дс

4b9b3361

Ответ 1

Спасибо за ваши ответы.

Я провел несколько дальнейших испытаний. На виртуальной машине, работающей под управлением Win7 и Java 8, она также выглядела неплохо, а также на другой, работающей под Win8 и Java 8.

Изменение видеокарты на максимальную производительность также ничего не изменило. Но на основании этого я сделал еще несколько исследований и, наконец, выяснил причину проблемы: Мой ноутбук (ThinkPad T540p) имеет 2 видеокарты: встроенный Intel GMA 4600 и внешнюю карту Nvidia. Похоже, OS/driver может решить, какую графическую карту использовать для отображения и даже для каких приложений. За исключением 3D-приложений, я думаю, что в основном используется карта Intel - я думаю, по соображениям энергоэффективности (даже если она не работает от батареи).

На панели управления Nvidia я могу настроить, что конкретное приложение всегда должно использовать определенную графическую карту, поэтому я определил, что Java всегда должна использовать графическую карту Nvidia, и это, похоже, решило проблему: с картой Nvidia, все выглядит хорошо.