Как решить / обойти ошибку в Windows System Look and Feel

В Windows L'n'F JButtons имеют границу, которую нельзя настроить setBorder(), Из-за этой границы JButtons не вписываются в Look and Feel.

Как вы могли видеть на этом скриншоте
http://tijamocobs.no-ip.biz/border_jbutton.png
В Windows 8 есть небольшая рамка вокруг кнопок J Look and Feel.

Эта граница является фоном JButton. Это внутри границы, поэтому я не могу использовать setBorder() а также setBorderPainted(false) настроить это. setMargin() тоже не решает проблему. Так как в реальной программе я просто хочу использовать значок в качестве описания, без текста, я мог бы использовать setContentAreaFilled(false) но это всего лишь обходной путь для кнопки, и он не помогает пользователю увидеть значок как кнопку. setOpaque(false) также не увеличивает размер кнопки.
Кажется, нет ключа для UIManager.put(_key_,_value) который может решить эту проблему.

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

Мне кажется, что единственным решением является изменение связанных методов рисования, но это не решение, поскольку я хочу использовать System Look And Feel. Кажется, это ошибка в Look and Feel!?

Есть ли другая возможность, о которой я не знаю (я не упомянул выше)?

(Просто чтобы прояснить: моя проблема не должна удалять рамку фокуса! Я хочу, чтобы значок заполнил его полностью, без небольшого фонового пространства вокруг, которое может быть толщиной всего 1 пиксель)

Я просто потратил некоторое время, чтобы противостоять идее ошибки. Я сделал простой WPF-проект с Visual Studio 2013. Я написал следующий XAML-код, и ошибка доказана: в обычном приложении Windows кнопка с высотой 30 заполняет все место рисунком кнопки - такого нет граница!

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox HorizontalAlignment="Left" Height="30" VerticalAlignment="Top" Width="200"/>
        <Button Content="Button" Height="30" Width="30" Margin="200,0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
    </Grid>
</Window>

в любом случае: есть ли решение, чтобы решить эту ошибку? это ошибка по вашему мнению?

короткий пример

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFrame extends JFrame {

    public TestFrame(){
        setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
        for (int i = 0; i < 3; i++) {
            JButton btn = new JButton(".");
            add(btn);
        }
        pack();
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        TestFrame tiss = new TestFrame();
        tiss.setVisible(true);
    }

}

Пример кода (длинная версия):

Этот пример немного показывает реальный дизайн фреймов. Разница может заключаться в том, что кнопки в реальном приложении содержат только значок без текста.

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestFrame extends JFrame {

public TestFrame(){
    JPanel muh = new JPanel();
    muh.setLayout(new BoxLayout(muh, BoxLayout.PAGE_AXIS));
    for (int i = 0; i < 3; i++) {
        Container c = new JPanel();
        c.setLayout(new BoxLayout(c, BoxLayout.LINE_AXIS));
        Box bx = Box.createHorizontalBox();
        final String[] tmp = {"anything1","anything2"};
        JComboBox<String> cmbbx = new JComboBox<String>(tmp);
        cmbbx.setMinimumSize(new Dimension(80,20));
        bx.add(cmbbx);
        JButton btn = new JButton(".");
//      not working:
//      btn.setBorder(null);
//      btn.setBorder(BorderFactory.createEmptyBorder());
        btn.setMinimumSize(new Dimension(cmbbx.getMinimumSize().height,cmbbx.getMinimumSize().height));
        btn.setPreferredSize(new Dimension(30,30));
        btn.setMaximumSize(new Dimension(30,30));
        bx.add(btn);
        c.setMaximumSize(new Dimension(Integer.MAX_VALUE,30));
        c.add(new JLabel("Just anything"));
        c.add(bx);
        muh.add(c);
    }
    add(muh,BorderLayout.CENTER);
    pack();
}

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException,     IllegalAccessException, UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        TestFrame tiss = new TestFrame();
        tiss.setVisible(true);
    }

}

1 ответ

Просто добавьте эту строку

btn.setFocusPainted(false);
Другие вопросы по тегам