Как решить / обойти ошибку в Windows System Look and Feel
В Windows L'n'F JButtons имеют границу, которую нельзя настроить setBorder()
, Из-за этой границы JButtons не вписываются в Look and Feel.
Как вы могли видеть на этом скриншоте
В 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);
}
}