2016-01-27 58 views
2

我需要將一些JButton放在一個非常小的地方,問題是Nimbus LAF自動在它們周圍放置一些空間,結果按鈕看起來比實際小。如何擺脫Nimbus LAF按鈕周圍的空間?

在下面的示例程序中,我使用了一個具有0個水平和垂直間隙的FlowLayout,並且我預計這些按鈕之間沒有任何空間會緊緊坐在一起。如果我評論Nimbus LAF的設置,它們的行爲如預期。

import javax.swing.*; 
import java.awt.FlowLayout; 

public class NimbusSpace { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       buildGUI(); 
      } 
     }); 
    } 

    private static void buildGUI() { 
     try { 
      UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
     } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { 
      e.printStackTrace(); 
     } 

     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
     p.add(createButton("aa")); 
     p.add(createButton("bb")); 
     p.add(createButton("cc")); 

     f.add(p); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static JButton createButton(String text) { 
     JButton b = new JButton(text); 

//  b.setBorder(null); 
//  b.setBorderPainted(false); 
//  b.setMargin(new Insets(0,0,0,0)); 
//  b.putClientProperty("JComponent.sizeVariant", "large"); 
//  b.putClientProperty("JComponent.sizeVariant", "mini"); 

//  UIDefaults def = new UIDefaults(); 
//  def.put("Button.contentMargins", new Insets(0,0,0,0)); 
//  b.putClientProperty("Nimbus.Overrides", def); 

     return b; 
    } 
} 

正如你可以在createButton註釋掉的代碼看,我嘗試了不少東西,但他們沒有刪除按鈕周圍的空間。

編輯:根據評論中的討論,似乎不可能刪除按鈕的矩形邊緣和繪製的圓角矩形輪廓之間的空間。 Nimbus保留這兩個像素用於「聚焦高光」,如果不重新實現許多Nimbus功能,這可能無法更改。

所以我接受了guleryuz的把戲:如果按鈕位於重疊和負位置,他們可以看起來更大。在實踐中,這個想法似乎有效,但它不是一個很乾淨的解決方案,所以如果你知道一個更好(並且相當容易實現)的解決方案,請不要猶豫回答...

+0

你的意思是按鈕應該像這個例子一樣? http://stackoverflow.com/questions/34782238/connect-link-buttons-graphically-together – hamena314

+0

@ hamena314我的實際問題是,我在一個小地方有一些小按鈕,這個問題使他們看起來比他們小得多。我的例子只是爲了說明問題。你的例子看起來很有趣,但我希望有定期的Nimbus按鈕,只有更大的看。 – lbalazscs

+0

「間距」是爲「焦點高光」留出空間 – MadProgrammer

回答

0

方法1:

JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, -4, 0)); 

方法2:

JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); 
    p.add(createButton("aa", 1)); 
    p.add(createButton("bb", 2)); 
    p.add(createButton("cc", 3)); 

在createButton方法一些修改

private static JButton createButton(String text, final int s) { 
    JButton b = new JButton(text){ 
     @Override 
     public void setLocation(int x, int y) { 
      super.setLocation(x-(s*4), y); 
     } 
    }; 
    return b; 
} 

方法3

JPanel p = new JPanel(new MigLayout("ins 0, gap -5","[][][]")); 
+0

非常有創意伎倆把按鈕上其他按鈕的頂部,並在這個簡單的例子作品,但我真正的問題是不同的,具有更復雜的佈局,所以我還是希望會有,在問題的解答案件以及 – lbalazscs

+0

我編輯我的答案與另一個創意技巧;) – guleryuz

+0

哦,男人,你是一個創造性的天才!我認爲,在最糟糕的情況下,我需要編寫一個複雜的佈局管理器,將組件置於瘋狂的負面和重疊的位置,但通過這個技巧,我已經實現了我想要的外觀。在真正的代碼中,我還需要重寫setSize,並且我必須小心,因爲佈局管理器會兩次調用setLocation,所以我只保留一個標誌以僅調用第一個調用。我upvoted,但我還沒有接受 - 也許有人找到一個適當的,強大的解決方案。 – lbalazscs

0

請注意,如果您設置背景顏色,然後調用setOpaque(true),你可以看到按鈕正好相反。這就是Nimbus如何畫一個按鈕;我不認爲你可以改變按鈕的矩形邊緣和繪製的圓角矩形輪廓之間的空間。

如果空間狹小,則可以通過取消註釋你的UIDefaults的線條和修改contentMargins性質有點收縮大小(但不使用0,0,0,0,使用類似2,8,2, 8)。

+0

正確。問題在於按鈕看起來比實際小,我們同意這一點。但我仍然希望有一個解決方案。是的,問題在於空間很重要,我在一個小地方有一些小按鈕,這個問題使得它們看起來比現在更小。 2,8,2,8技巧並沒有改變真正的代碼中的任何東西,我仍然試圖理解爲什麼。 – lbalazscs

+0

我現在看到,「Button.contentMargins」隻影響按鈕的首選大小,但我已經將它設置爲實際代碼中的修復和小值,所以這對我沒有幫助。正如你所說的,問題在於按鈕的矩形邊緣與繪製的圓角矩形輪廓之間的空間。 – lbalazscs