我已經創建了一個文本字段組件,其中帶有一個「x」按鈕,用於清除該字段的文本。當使用Window的系統外觀和感覺(對於Windows)時,它非常適用,但是在使用Nimbus時我試圖獲得正確的外觀,即我無法像使用系統一樣使用button.setMargin(new Inset(0, 0, 0, 0)
更改按鈕上的邊距外觀和感覺。如何覆蓋單個按鈕的Nimbus按鈕邊距
我確實在使用Nimbus時尋找幫助來設置邊距,這似乎是一個常見問題。我能夠找到一個部分解決方案,它允許我更改邊距,但它會更改所有按鈕的邊距,我只希望單個按鈕與默認值不同。
我明確地設置了'x'按鈕的大小,它是從'x'字符串的邊界計算出來的,以便它顯示出'x'的大小。
結果使用Windows的系統的外觀和感覺,這就是我要找的整體外觀時:使用默認的Nimbus外觀時
結果; 'x'溢出Nimbus允許的空間,導致省略號。使用雨雲並重寫Button.contentMargins時
結果:現在的「X」按鈕看起來是正確的,但「測試」按鈕看起來可怕。
的源代碼:
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.geom.Rectangle2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.LookAndFeel;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
public class TextFieldTest {
public static void main(String[] args) {
boolean useNimbusLookAndFeel = false;
boolean overrideNimbusDefaults = false;
String lafName = UIManager.getSystemLookAndFeelClassName();
if (useNimbusLookAndFeel) {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
lafName = info.getClassName();
break;
}
}
}
try {
UIManager.setLookAndFeel(lafName);
}
catch (ClassNotFoundException e) {}
catch (InstantiationException e) {}
catch (IllegalAccessException e) {}
catch (UnsupportedLookAndFeelException e) {}
//Code to set override default button insets for Nimbus:
if (useNimbusLookAndFeel && overrideNimbusDefaults) {
LookAndFeel laf = UIManager.getLookAndFeel();
if (laf != null) {
UIDefaults def = laf.getDefaults();
def.put("Button.contentMargins", new Insets(0,0,0,0));
}
}
//Create frame:
JPanel panel = new JPanel();
panel.add(new JButton("test"));
panel.add(new DeletableTextField());
JFrame frame = new JFrame();
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
static class DeletableTextField extends JTextField {
JButton mButton = null;
public DeletableTextField() {
super(30);
setup();
}
private void setup() {
mButton = new JButton("x");
mButton.setMargin(new Insets(0, 0, 0, 0));
add(mButton);
}
@Override
public void paint(Graphics g) {
g.setFont(mButton.getFont());
Rectangle2D rect = g.getFontMetrics().getStringBounds(mButton.getText(), g);
int stringWidth = (int)rect.getWidth();
int topOffset = 3;
int rightOffset = 3;
int bottomOffset = 3;
int width = (int)Math.ceil(stringWidth * 2.5);
int height = getHeight() - (bottomOffset + topOffset);
int x_coord = getWidth() - (rightOffset + width);
mButton.setMargin(new Insets(0, 0, 0, 0));
mButton.setBounds(x_coord, topOffset, width, height);
super.paint(g);
}
}
}
我知道,我可以用其他方式做到這一點,像畫我自己的「X」在上面,但我認爲這將是很好拿當前外觀按鈕繪畫功能的優勢,可以實現統一的外觀。
所以我想問一下,在使用Nimbus的外觀時感覺沒有更改所有按鈕的邊距是否有改變單個JButton邊距的方法。或者,如果已經有一個外觀類似的swing組件(帶有'x'按鈕的文本框),我可以使用它。
雖然我不能與你的問題的幫助,該功能是太酷了:d GL與修復! – Ari 2012-01-07 05:12:48