【问题标题】:Remove JButton rectangle white border移除 JButton 矩形白色边框
【发布时间】:2013-04-22 15:13:01
【问题描述】:

有人知道如何去除 JButton 上的白色矩形边框吗?当按钮有点圆润时,此问题仅适用于 Windows 外观。

请在图片上找到示例。

将边框设置为空或 null 无济于事。保证金也是如此。

只有当我将按钮的不透明度设置为 false 时,白色边距/边框才会消失,但不幸的是,在这种情况下,整个按钮在某些版本的窗口上也是不透明的。

当我将不透明度设置为 false 时,它​​看起来像:

代码示例:

public class TestFrame extends javax.swing.JFrame {

/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {

            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }

            TestFrame inst = new TestFrame();
            inst.setLocationRelativeTo(null);
            inst.setVisible(true);
        }
    });
}

public TestFrame() {

    this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    this.setLayout(null);
    this.getContentPane().setBackground(Color.BLACK);

    JButton button = new JButton();
    button.setBounds(10, 10, 100, 50);
    button.setBorder(BorderFactory.createEmptyBorder());    // not working
    button.setBorder(null);                                 // not working
    button.setMargin(new Insets(0,0,0,0));                  // not working

    add(button);
    pack();
    setSize(400, 300);
}

}

谢谢, 卢布斯

【问题讨论】:

  • 那些 Insets 可能因 Win7 中使用的不同主题而不同(没有人知道用户在您的 PC 中设置),(也许,我希望)与 Java 版本无关,尝试更改 Insets在 UImanager 中,或来自容器(此 JButton 的父级),以获得更好的帮助,尽快发布 SSCCE,简短,可运行,可编译,大约上午问题
  • 这发生在所有 Windows PC 上。您是指哪个 UI 管理器属性?我找不到 Button.margin 或类似的东西。
  • @splunebob 请看第二张图片。确实有一些白色边框或边距,问题是我不能只将不透明度设置为 false,因为它不是多平台的。
  • @Lubos:我仍然只看到 1 个按钮。
  • 不要发布图片。发布您的 SSCCE,以便我们可以清楚地看到您的代码在做什么。

标签: java swing windows-7 look-and-feel insets


【解决方案1】:

似乎是一个绘画问题。您可以使用:

button.setBackground( Color.BLACK );

【讨论】:

  • 是的,你说得对。看起来像绘画问题。使用您的解决方案它可以工作,但它有点hack :) 我现在需要找到一种方法来修复它,例如当我使用渐变作为背景时...
  • +1 表示直接的方法。 Lubos:另见相关example
  • -1 这并不能解决我的 Win XP 机器上的问题。它隐藏了大部分内容,但现在看起来有点草率,底部的一些边框仍然可以窥视。
【解决方案2】:

编辑:见下面的 cmets。即使使用适当的布局,此示例仍然显示效果。设置背景颜色似乎显示了不需要的边框。金属不会显示此效果。似乎 Windows L&F 显示圆角边缘,但按钮仍然是矩形。仅当容器的 BG 颜色更改为明显的颜色(如黑色)时,它们之间的空间才会显着。

import java.awt.*;

import javax.swing.*;

public class TestFrame extends JFrame
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
        try
        {
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }

        TestFrame inst = new TestFrame();
        inst.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        inst.setLocationRelativeTo(null);
        inst.setVisible(true);
      }
    });
  }

  public TestFrame()
  {
    JButton button = new JButton("One");
    JButton button2 = new JButton("Two");

    JPanel p = new JPanel();
    p.setBackground(Color.BLACK);
    p.setLayout(new FlowLayout());
    p.add(button);
    p.add(button2);

    add(p);
    setSize(400, 300);
  }
}

【讨论】:

  • Do you realise that you're adding the button directly to the frame? - frame.add() 方法将组件添加到内容窗格。内容窗格是一个 JPanel。这是一个 SSCCE,所以这不是一个大问题。更大的问题是使用空布局。
  • @camickr:是的,但它确实在视觉上有所作为。 OP 的代码对框架使用空布局,添加了一个按钮,并显示了一个边框。我的更改以相同的方式构造按钮,将其添加到具有空布局的面板(而不是具有空布局的框架),然后将该面板添加到框架(使用默认布局)
  • 在这种情况下,按钮的放置位置根本不重要。那只是测试示例。不管按钮放在哪里,问题都是一样的
  • 这只是在ContentPane中造成的,1pixel处有白边
  • 我的示例删除了边框,但是我忽略了将 BG 颜色设置为黑色。这似乎是罪魁祸首。我编辑了我的帖子以使用正确的 LayoutManager 但仍然产生边框效果。只需注释/取消注释 setBackgound(...) 调用即可查看差异。
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多