在Windows L'n'F中,JButtons有一个无法由setBorder()
配置的边框。由于这个边界,JButtons不适合外观。
正如您在此截图中看到的那样
在Windows 8外观中,JButtons周围有一个小边框。
此边框是JButton的背景。它位于边框内部,这就是我无法使用setBorder()
和setBorderPainted(false)
进行配置的原因。 setMargin()
也没有解决问题。因为在实际程序中我只想使用图标作为描述,没有任何文字,我可以使用setContentAreaFilled(false)
但这只是按钮的解决方法,它无法帮助用户看到图标是按钮。 setOpaque(false)
也不会增加Button的大小。
似乎没有UIManager.put(_key_,_value)
的密钥可以解决这个问题。
另一种解决方法可能是更改框架的设计,除了按钮之外的所有元素都会获得额外的边框。但这似乎很奇怪,我认为这可能会导致其他外观和感觉出现问题。
对我来说,唯一的解决方案似乎是修改相关的paint-methods,但这不是解决方案,因为我想使用System Look And Feel。它似乎是外观中的一个错误!?
还有其他可能性,我不知道(我上面没有提到)?
(只是要明确:我的问题不会删除焦点边框!我希望图标填满整个空间,周围没有小的背景色空间,可能只有1个像素的厚度)
我只是花了一些时间来反击一个错误的想法。我使用Visual Studio 2013制作了一个简单的WPF项目。我编写了以下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>
无论如何:有没有解决这个bug的解决方案?这是你认为的错误吗?
简短示例
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);
}
}
答案 0 :(得分:0)
只需添加此行
即可btn.setFocusPainted(false);