Java 如何解决/解决Windows系统外观中的缺陷

Java 如何解决/解决Windows系统外观中的缺陷,java,swing,jbutton,look-and-feel,Java,Swing,Jbutton,Look And Feel,在Windows LaF中,JButtons有一个边框,无法通过setBorder()对其进行配置。因为这个边框,JButton不适合这个外观 正如您在这个屏幕截图中所看到的 在Windows8的外观中,JButtons周围有一个小边框 此边框是JButton的背景。它在边框内,这就是为什么我不能使用setboorder()和setboorderpained(false)来配置它的原因setMargin()也不能解决问题。因为在真实的程序中,我只想使用图标作为描述,没有任何文本,我可以使用se

在Windows LaF中,JButtons有一个边框,无法通过
setBorder()
对其进行配置。因为这个边框,JButton不适合这个外观

正如您在这个屏幕截图中所看到的

在Windows8的外观中,JButtons周围有一个小边框

此边框是JButton的背景。它在边框内,这就是为什么我不能使用
setboorder()
setboorderpained(false)
来配置它的原因
setMargin()
也不能解决问题。因为在真实的程序中,我只想使用图标作为描述,没有任何文本,我可以使用
setContentAreaFilled(false)
,但这只是按钮的一种解决方法,不能帮助用户看到图标是按钮
setOpaque(false)
也不会增加按钮的大小。
似乎没有
UIManager.put(\u Key,\u value)
的键,这可以解决此问题

另一个解决方法可能是更改框架的设计,即除按钮外的所有元素都有一个额外的边框。但这似乎很奇怪,我认为这可能会导致其他外观和感觉出现问题

对我来说,唯一的解决方案似乎是修改相关的绘制方法,但这不是解决方案,因为我想使用系统的外观。这似乎是一个错误的外观和感觉

有没有其他的可能性,我不知道(我上面没有提到)

(需要澄清的是:我的问题不应该删除焦点边框!我希望图标填充其完整的空间,周围没有小的背景色空间,可能只有1像素厚)

我只是花了一些时间来反驳关于bug的想法。我使用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>

不管怎样:有解决这个错误的方法吗?你认为这是一个错误吗

简短示例

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);
    }

}
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestFrame扩展了JFrame{
公共测试框架(){
setLayout(新的BoxLayout(getContentPane(),BoxLayout.PAGE_轴));
对于(int i=0;i<3;i++){
JButton btn=新JButton(“.”);
添加(btn);
}
包装();
}
publicstaticvoidmain(String[]args)抛出ClassNotFoundException、instanceionexception、IllegalAccessException、UnsupportedLookAndFeelException{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
TestFrame tiss=新的TestFrame();
设置可见(真);
}
}
示例代码(长版本):

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);
    }

}
导入java.awt.BorderLayout;
导入java.awt.Container;
导入java.awt.Dimension;
导入javax.swing.Box;
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类TestFrame扩展了JFrame{
公共测试框架(){
JPanel muh=新的JPanel();
muh.setLayout(新的BoxLayout(muh,BoxLayout.PAGE_轴));
对于(int i=0;i<3;i++){
容器c=新的JPanel();
c、 setLayout(新的BoxLayout(c,BoxLayout.LINE_轴));
Box bx=Box.createHorizontalBox();
最后一个字符串[]tmp={“anything1”、“anything2”};
JCOMBOX cmbbx=新的JCOMBOX(tmp);
cmbbx.设置最小尺寸(新尺寸(80,20));
添加(cmbbx);
JButton btn=新JButton(“.”);
//不工作:
//btn.订单(空);
//btn.setboorder(BorderFactory.createEmptyByOrder());
btn.setMinimumSize(新尺寸(cmbbx.getMinimumSize().height,cmbbx.getMinimumSize().height));
btn.setPreferredSize(新尺寸(30,30));
btn.设置最大尺寸(新尺寸(30,30));
添加(btn);
c、 setMaximumSize(新维度(整数.MAX_值,30));
c、 添加(新JLabel(“任何东西”);
c、 添加(bx);
muh.加入(c);
}
添加(muh,BorderLayout.CENTER);
包装();
}
publicstaticvoidmain(String[]args)抛出ClassNotFoundException、instanceionexception、IllegalAccessException、UnsupportedLookAndFeelException{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
TestFrame tiss=新的TestFrame();
设置可见(真);
}
}
只需添加这一行即可

btn.setFocusPainted(false);

我刚刚添加了一个编辑,上面说我不是指焦点,谢谢:)因为我没有这样做所需的10个声誉,对不起,没有。我刚刚将它上传到我的个人网站上。不幸的是,我不能保证该图像将永远存在:(.这里有一个链接:您是否尝试过:
btn.setboorder(new EmptyBorder())
甚至
btn.setboorder(null)
@a_horse\u with_no_name是的我尝试过
btn.setboorder(BorderFactory.createEmptyBorder())
btn.setboorder(null)
,谢谢您的提示(对不起,忘了通知;))