有没有办法在Java JFrame中自动编辑按钮的属性?



我为我的一个按钮设置了以下属性:

try {
name.setIcon(new javax.swing.ImageIcon(ImageIO.read(newFile("./src/main/java/resorces/Default.png"))));
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
name.setBorderPainted(false); 
name.setContentAreaFilled(false); 
name.setFocusPainted(false); 
name.setOpaque(false);

我的问题是我有一堆像这样的按钮。我想知道是否有可能使一个方法,将在按钮的名称和设置所有的属性为我。

的例子:

public void SetProperties(??? x){
try {
x.setIcon(new javax.swing.ImageIcon(ImageIO.read(newFile("./src/main/java/resorces/Default.png"))));
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
x.setBorderPainted(false); 
x.setContentAreaFilled(false); 
x.setFocusPainted(false); 
x.setOpaque(false);
}

谢谢你的帮助!

你可以…

使用"构造模式">

这个概念是提供一个工作流,允许你应用所有你想要的属性,然后有对象"构建",例如…

public class ButtonBuilder<Builder extends ButtonBuilder<Builder>> {
private JButton button;
public ButtonBuilder() {
button = new JButton();
}

public Builder withText(String text) {
button.setText(text);
return (Builder)this;
}

public Builder withIcon(Icon icon) {
button.setIcon(icon);
return (Builder)this;
}

public Builder borderPainted(boolean painted) {
button.setBorderPainted(painted);
return (Builder)this;
}

public Builder contentAreaFilled(boolean painted) {
button.setContentAreaFilled(painted);
return (Builder)this;
}

public Builder focusPainted(boolean painted) {
button.setFocusPainted(painted);
return (Builder)this;
}

public JButton build() {
return button;
}
}

注:注意,构建器的常见模式是将属性存储在某种缓存/查找中,然后在调用build时应用这些属性,但在这种情况下,直接将它们应用于按钮本身更容易

注意:显然,我只提供了一小部分属性,您可能想要为按钮指定,您需要添加其余的;)

然后你可以用这样的东西来创建按钮。

JButton happyButton = new ButtonBuilder()
.withText("Happy")
.withIcon(new ImageIcon(ImageIO.read(getClass().getResource("/images/happy.png"))))
.borderPainted(false)
.focusPainted(false)
.contentAreaFilled(false)
.build();

但这不是我想要的,我不想每次创建按钮时都要重新应用所有属性

是的,我知道,我正要说呢。一旦你有了"基础"构建器,您可以创建一个或多个"自定义"。扩展,可以直接应用默认值,例如…

public class MyCustomButtonBuilder extends ButtonBuilder<MyCustomButtonBuilder> {
public MyCustomButtonBuilder(String text) {
this(text, null);
}

public MyCustomButtonBuilder(Icon icon) {
this(null, icon);
}

public MyCustomButtonBuilder(String text, Icon icon) {
super();
withText(text)
.withIcon(icon)
.borderPainted(false)
.focusPainted(false)
.contentAreaFilled(false);
}
}

,然后可以像这样使用…

JButton sadButton = new MyCustomButtonBuilder("Sad", new ImageIcon(ImageIO.read(getClass().getResource("/images/Sad.png"))))
.build();
<标题>

你可以…使用"工厂模式",例如…

public class ButtonFactory {
public static JButton makePlainButton() {
return makePlainButton(null, null);
}
public static JButton makePlainButton(String text) {
return makePlainButton(text, null);
}
public static JButton makePlainButton(String text, Icon icon) {
JButton btn = new JButton(text, icon);
btn.setBorderPainted(false);
btn.setContentAreaFilled(false);
btn.setFocusPainted(false);
btn.setOpaque(false);
return btn;
}
}

可以像这样使用

JButton heartButton = ButtonFactory.makePlainButton(
"Heart", 
new ImageIcon(ImageIO.read(getClass().getResource("/images/Heart.png")))
);

工厂模式可以允许您提供多个不同类型的按钮,根据您的共同需求进行不同的配置。

<标题>

你可以…结合这两个概念,例如…

public class ButtonFactory {
public static JButton makePlainButton() {
return makePlainButton(null, null);
}
public static JButton makePlainButton(String text) {
return makePlainButton(text, null);
}
public static JButton makePlainButton(String text, Icon icon) {
return new ButtonBuilder()
.withText(text)
.withIcon(icon)
.borderPainted(false)
.focusPainted(false)
.contentAreaFilled(false)
.build();
}
}

最新更新