2013-12-18 5 views
1

Я строю программу Swing, и я хочу, чтобы иметь возможность использовать кнопку, чтобы изменить некоторые функции (шрифт, цвет переднего плана, цвет фона и т.д.) JComponents (JLabel, JButton) ,Alter JComponent из Listener/Event

Я могу сделать это без проблем, если все компоненты были явно объявлены и определены, но я не могу понять, как это сделать, если они неявно построены с использованием общих методов.

Ниже приведено 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; 
    } 

} 

ответ

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; 
} 
+0

Я понимаю, что вы сделали здесь, и я думаю, что это будет работать для того, что я пытаюсь сделать. Большое спасибо! – FalconRunner11

1

Создайте метод styleOne в классе JComponent, который устанавливает все значения вам нужно. Он будет иметь доступ ко всем областям вашего класса. Внутри прослушивателя действий вызовите этот метод.

Кроме того, не создавайте свои кнопки таким образом. Создайте их внутри конструктора напрямую. Если вы хотите переопределить внешний вид кнопок, сделайте это в методе или конструкторе init. Или, еще лучше, подкласс JButton.

Смежные вопросы