2013-10-08 3 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

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