2015-04-03 42 views
-2

什么是编写(在Java Swing中)多个可操作对象之间/从多个可操作对象之间的依赖关系的正确方法?来自多个可操作对象的Java Swing依赖关系

E.g.假设我们有2个JButton对象和2个其他GUI对象(例如2个JLabel对象) 单击JButton1时,JLabel1应该变为可见,并将其文本更改为“NewText1”,而JLabel2应该变为不可见。 单击JButton2时,JLabel1应该变为不可见,而JLabel2应该变为可见并将其文本更改为“NewText2”。

我想出了一对解决方案,其中没有一个我喜欢我自己 (主要基于子类JLabel对象,以确保具有不同的ActionPerformed方法,然后将它们注册为使用JButtons的侦听器)。 但是这并没有扩展,因为对于每个依赖/侦听器对象(在本例中为JLabel),我最终创建了一个新类。随着GUI对象的激增,所有这些类很快就难以跟踪和管理。另一方面,我宁愿避免使用匿名类,因为我可能需要从其他代码段访问这些GUI元素。

回答

2

当单击JButton1时,JLabel1应该变为可见并将其文本更改为“NewText1”,而JLabel2应该变为不可见。当单击JButton2时,JLabel1应该变为不可见,而JLabel2应该变为可见并将其文本更改为“NewText2”。

我启用了文本,而不是使其可见或不可见。这样,文本没有在JPanel中移动。

Two Action Listeners

我写了两个动作侦听器,每个按钮的功能。

如果您有六个JButton和六个JLabel,那么您必须编写六个动作侦听器。你会为每个JButton编写一个动作监听器。

我会让动作侦听器匿名类,但既然你说过你不想要那样,我就让它们分开了内部类。

下面是生成GUI的代码。

package com.ggl.testing; 

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TwoActionListeners implements Runnable { 

    private JFrame frame; 

    private JLabel label1; 
    private JLabel label2; 

    @Override 
    public void run() { 
     frame = new JFrame("Two Action Listeners"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new FlowLayout(FlowLayout.LEADING, 30, 5)); 

     JButton button1 = new JButton("Button 1"); 
     button1.addActionListener(new Button1ActionListener()); 
     mainPanel.add(button1); 

     JButton button2 = new JButton("Button 2"); 
     button2.addActionListener(new Button2ActionListener()); 
     mainPanel.add(button2); 

     label1 = new JLabel("New Text 1"); 
     mainPanel.add(label1); 

     label2 = new JLabel("New Text 2"); 
     mainPanel.add(label2); 

     frame.add(mainPanel); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new TwoActionListeners()); 
    } 

    public class Button1ActionListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent event) { 
      label1.setEnabled(true); 
      label2.setEnabled(false); 
     } 

    } 

    public class Button2ActionListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent event) { 
      label1.setEnabled(false); 
      label2.setEnabled(true); 
     } 

    } 

} 
+0

Thanks @Gilbert Le Blanc! – Pedja 2015-04-04 00:02:11