我正在构建一个Swing程序,我希望能够使用一个按钮来更改JComponents
(JLabel
,{JButton
的某些功能(字体,ForeGround颜色,背景颜色等)。 {1}})。
如果组件都已经显式声明和定义,我可以毫无问题地执行此操作,但如果使用泛型方法隐式构建它们,我无法弄清楚如何执行此操作。
以下是我目前所拥有的 gist ,减去了一些不重要的细节。单击styleButton1
和2时,我想刷新或重建JFrame,以便将要素/样式的新值(在此示例中为Font)用于组件(testButton1
和2),通过更改currentFont
然后重新绘制。
我没有遇到任何错误,但是frame
和组件没有被重建/刷新,即单击样式按钮时没有任何反应。
有关如何使这项工作的任何想法?或者我可以使用任何其他方法来达到预期效果?
//imports
public class GuiTesting extends JFrame {
public static void main(String[] args) {
frame = new GuiTesting();
frame.setVisible(true);
}
static JFrame frame;
static Font standardFont = new Font("Arial", Font.BOLD, 10);
static Font secondFont = new Font("Times New Roman", Font.PLAIN, 10);
static Font currentFont = standardFont;
public GuiTesting() {
setTitle("GUI Testing");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 400);
JPanel mainPanel = new JPanel();
getContentPane().add(mainPanel);
mainPanel.add(basicButton("Button1"));
mainPanel.add(basicButton("Button2"));
mainPanel.add(style1Button("Style 1"));
mainPanel.add(style2Button("Style 2"));
}
public static JButton basicButton(String title) {
JButton button = new JButton(title);
button.setPreferredSize(new Dimension(80, 30));
button.setFont(currentFont);
return button;
}
public static JButton style1Button(String title) {
JButton button = new JButton(title);
button.setPreferredSize(new Dimension(80, 30));
button.setFont(standardFont);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentFont = standardFont;
frame.repaint();
}
});
return button;
}
public static JButton style2Button(String title) {
JButton button = new JButton(title);
button.setPreferredSize(new Dimension(80, 30));
button.setFont(secondFont);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentFont = secondFont;
frame.repaint();
}
});
return button;
}
}
答案 0 :(得分:1)
在JComponent类中创建一个styleOne方法,用于设置所需的所有值。它可以访问您班级的所有领域。在动作侦听器内部调用此方法。
另外,不要像那样静态地创建按钮。直接在构造函数中创建它们。如果要覆盖按钮的外观,请在init方法或构造函数中执行。或者,更好的是,JButton的子类。
答案 1 :(得分:1)
您可以在列表中存储需要刷新样式的组件:
private static List<JComponent> components = new ArrayList<JComponent>();
然后在您的basicButton()
方法中添加新组件以刷新组件:components.add(button);
然后在ActionListener
中,您可以执行下一行以刷新样式:
for(JComponent c : components){
c.setFont(currentFont);
}
或者您可以直接将组件传递给ActionListener
,如下所示:
JButton b1;
JButton b2;
mainPanel.add(b1 = basicButton("Button1"));
mainPanel.add(b2 = basicButton("Button2"));
mainPanel.add(style1Button("Style 1",b1,b2));
和style1Button()
代码:
public static JButton style1Button(String title,final JComponent... components) {
JButton button = new JButton(title);
button.setPreferredSize(new Dimension(80, 30));
button.setFont(standardFont);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentFont = standardFont;
for(JComponent c : components){
c.setFont(currentFont);
}
frame.repaint();
}
});
return button;
}