【问题标题】:How to solve/workaround a bug in Windows System Look and Feel如何解决/解决 Windows 系统外观中的错误
【发布时间】:2013-11-22 07:44:49
【问题描述】:

在 Windows LaF 中,JButtons 有一个无法由 setBorder() 配置的边框。由于这个边框,JButton 不适合外观。

正如您在此屏幕截图中看到的那样

在 Windows 8 Look And Feel 中,JButtons 周围有一个小边框。

这个边框是 JButton 的背景。它在边界内,这就是我不能使用setBorder()setBorderPainted(false) 来配置它的原因。 setMargin() 也不能解决问题。由于在实际程序中我只想使用一个图标作为描述,没有任何文本,我可以使用setContentAreaFilled(false) 但这只是按钮的一种解决方法,它不能帮助用户看到图标是一个按钮。 setOpaque(false) 也不会增加 Button 的大小。
UIManager.put(_key_,_value)好像没有Key可以解决这个问题。

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

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

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

(要明确一点:我的问题不应该是删除焦点边框!我希望图标填充其整个空间,而不是周围的小背景色空间,可能只有 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>

无论如何:有解决此错误的解决方案吗?您认为这是一个错误吗?

简短示例

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

}

【问题讨论】:

  • 你试过了吗:btn.setBorder(new EmptyBorder()) 甚至btn.setBorder(null)
  • @a_horse_with_no_name 是的,我试过btn.setBorder(BorderFactory.createEmptyBorder())btn.setBorder(null),感谢您的提示(抱歉,忘记了通知;))

标签: java swing jbutton look-and-feel


【解决方案1】:

只需添加这一行

btn.setFocusPainted(false);

【讨论】:

  • 我刚刚添加了一个编辑,上面说我不是指焦点,无论如何谢谢:)
  • 因为我没有这样做所需的 10 声望,抱歉没有。我刚把它上传到我的个人网站空间。不幸的是,我不能保证图像会永远存在:(。这是一个链接:tijamocobs.no-ip.biz/border_jbutton.png
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2016-01-03
  • 2018-05-18
  • 1970-01-01
相关资源
最近更新 更多