2013-10-08 36 views
0

我正在构建一个使用JFrame的程序。我最终想要的结果是实现一个ActionListener,当用户单击一个按钮时它将删除标签。例如:当用户点击JButton时,5个标签中的一个从框架中移除。当他们再次点击该按钮时,其余的4个标签中的一个被删除...等等,直到剩下0个标签。从技术上讲,我有程序按要求工作,但是,我试图看看是否有方法通过循环实现ActionListener事件,而不是为每个单独的标签列出if语句。非常感谢!JFrame - ActionListener

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 

//calls for public class to inherit features of JFrame within Java 
public class NoPurchaseReason extends JFrame implements ActionListener { 

private int removeText = 0; 

JButton btn = new JButton("Select"); 

JLabel lbl = new JLabel("Found better price"); 
JLabel lbl1 = new JLabel("Not as shown on website"); 
JLabel lbl2 = new JLabel("Wrong product"); 
JLabel lbl3 = new JLabel("Damaged upon delivery"); 
JLabel lbl4 = new JLabel("None of the above"); 

public static void main(String[] args) { 
    JFrame f = new NoPurchaseReason("Please tell us why you wish to return your purchase."); 
    f.setBounds(300, 100, 500, 500); 
    f.setVisible(true); 
    f.setBackground(Color.blue); 
} 

public NoPurchaseReason(String title) { 
    super(title); 
    setLayout(null); 
    lbl.setBounds(40, 40, 600, 40); 
    btn.setBounds(320, 10, 80, 20); 
    lbl.setBounds(100, 40, 100, 20); 
    lbl1.setBounds(100, 70, 100, 20); 
    lbl2.setBounds(100, 100, 150, 20); 
    lbl3.setBounds(100, 130, 100, 20); 
    lbl4.setBounds(100, 160, 100, 20); 

    add(btn); 
    add(lbl); 
    add(lbl); 
    add(lbl1); 
    add(lbl2); 
    add(lbl3); 
    add(lbl4); 
    btn.addActionListener(this); 
} 

public void actionPerformed(ActionEvent e) { 
    removeText++; 
    if (removeText == 1) { 
     lbl.setVisible(false); 
     lbl1.setBounds(100, 40, 100, 20); 
     lbl2.setBounds(100, 70, 100, 20); 
     lbl3.setBounds(100, 100, 150, 20); 
     lbl4.setBounds(100, 130, 100, 20); 
    } 
    if (removeText == 2) { 
     lbl1.setVisible(false); 
     lbl2.setBounds(100, 40, 100, 20); 
     lbl3.setBounds(100, 70, 150, 20); 
     lbl4.setBounds(100, 100, 100, 20); 
    } 
    if (removeText == 3) { 
     lbl2.setVisible(false); 
     lbl3.setBounds(100, 40, 150, 20); 
     lbl4.setBounds(100, 70, 100, 20); 
    } 
    if (removeText == 4) { 
     lbl3.setVisible(false); 
     lbl4.setBounds(100, 40, 100, 20); 
    } 
    if (removeText == 5) { 
     lbl4.setVisible(false); 
    } 
} 

}

回答

1

学习如何正确使用layout managers会为你节省很多的麻烦,从长远来看。

你还会发现人们会告诉你要坚持single responsibility principle,并避免犯类违反这个原则的类(例如,扩展JFrame和实现ActionListener)。

你也会听到人们告诉你比操作监听器更喜欢使用动作(如果你需要跨多个组件共享功能,那就是)。

一个简单的方法是专用整个面板来保存标签,并直接删除面板中的第一个标签,直到没有更多标签。这里有一个例子:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class LabelDemo 
{ 
    public static void main(String[] args) { 
     String[] labels = { 
       "Found better price", 
       "Not as shown on website", 
       "Wrong product", 
       "Damaged upon delivery", 
       "None of the above" 
     }; 
     final JFrame frame = new JFrame(); 
     final JPanel panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     for (String s: labels) { 
      panel.add(new JLabel(s)); 
     } 
     frame.add(panel); 
     JButton button = new JButton("Select"); 
     button.addActionListener(new ActionListener() { 
      @Override public void actionPerformed(ActionEvent e) { 
       if (panel.getComponentCount() > 0) 
        panel.remove(0); 
       frame.repaint(); 
      } 
     }); 
     frame.add(button, BorderLayout.NORTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

而且,你可能只是心里有一定的目标,我是不知道的,但说实话看起来像一个清单将是在这种情况下更好。这里有一个例子:

String[] labels = { 
     "Found better price", 
     "Not as shown on website", 
     "Wrong product", 
     "Damaged upon delivery", 
     "None of the above" 
}; 
JList<String> list = new JList<>(labels); 
int option = JOptionPane.showConfirmDialog(null, list, 
     "Please tell us why you wish to return your purchase.", 
     JOptionPane.OK_CANCEL_OPTION); 
if (option == JOptionPane.OK_OPTION) { 
    String selectedValue = list.getSelectedValue(); 
    System.out.println(selectedValue); // Do something with it. 
} 
+0

非常感谢你们的例子!这比我的代码更加简洁。我似乎遇到的唯一麻烦是当我尝试实现您提供的第一个示例时,我继续得到以下错误:标记“setLayout”上的语法错误,=在此标记后预期----不确定为什么这是怎么回事? – user2825293

+0

这些示例需要直接粘贴到方法内部,而不是类(我在主要方法中很快写入它们)。只有声明可以存在于方法之外,在这种情况下,错误发生在'setLayout'上,因为它不是一个声明,而是一个方法调用,因此它必须进入某种方法。我在编写代码时并没有真正将你的代码作为基础,所以这不是“面向对象”的全部 - 对此感到遗憾。为了说明我在说什么,我在第一个示例中添加了额外的代码。 – sgbj

+0

非常完美!出于某种原因,我以为我将setLayout放在我的方法中,但显然我不是。我非常感谢你的帮助。 :) – user2825293