2017-06-28 1 views
2

Ich versuche Etiketten jedes Mal zu erstellen, wenn eine Schaltfläche geklickt wird. Die Position der Etiketten sollte geändert werden. Es sollte bei jedem Klick übereinander liegen. Aber es funktioniert nicht. Kein Label erstellen Ich kann nicht einmal ein einzelnes JLabel aus dem Klick-Listener-Code erstellen. Aber die Ausführung findet innerhalb der innersten 'if' Anweisung statt.dynamisch hinzufügen JLabel zu UI in Java auf Knopfdruck mit einem einzigen Objekt

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class ChatClient{ 
static int y=600; 
static JLabel label=null; 
public static void main(String args[]) throws Exception{ 
    String defaultMessage = "Enter your message.."; 
    JFrame frame = new JFrame("FireFly"); 
    JTextField text = new JTextField(defaultMessage); 
    //manipulate the default message in the text field 
    text.addFocusListener(new FocusListener(){ 
    public void focusGained(FocusEvent ae){ 
     if(text.getText().equals(defaultMessage)){ 
      text.setText(""); 
     } 
    } 
    public void focusLost(FocusEvent ae){ 
     if(text.getText().isEmpty()){ 
     text.setText(defaultMessage); 
     } 
    } 
    }); 
    text.setBounds(10,620,295,40); 
    frame.add(text); 
    JButton button = new JButton("SEND"); 
    button.setBounds(310,620,80,40); 
    button.setForeground(Color.WHITE); 
    button.setBackground(Color.decode("#11A458")); 
    button.setFocusPainted(false); 
    button.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent ae){ 
     if(!text.getText().equals(defaultMessage)) 
     { 
     if(!text.getText().isEmpty()){ 
      label=new JLabel(text.getText()); 
      label.setBounds(10,y,380,20); 
      y=y-20; 
      frame.add(label); 
      } 
     } 
    } 
    }); 

    frame.add(button); 
    frame.setSize(400,700); 
    frame.setLayout(null); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 
} 
+1

Sie würden rufen müssen 'revalidate()' und 'repaint()' auf dem Behälter Sie jederzeit hinzufügen oder entfernen Komponenten daraus. Ihr erster großer Fehler ist es, Null-Layouts zu verwenden - vermeiden Sie diese, da sie Sie zurückkommen werden, garantiert. –

+2

Ich muss mich auch fragen, ob es besser wäre, eine JList zu verwenden. –

Antwort

2

Aufruf revalidate und auf den Behälter neu aufgebaut nach dem JLabel Zugabe wird die GUI sagt die neue Komponente zu positionieren und die Behälter neu zu zeichnen, so dass es zeigt. zB

public void actionPerformed(ActionEvent ae) { 
    if (!text.getText().equals(defaultMessage)) { 
     if (!text.getText().isEmpty()) { 
      label = new JLabel(text.getText()); 
      label.setBounds(10, y, 380, 20); 
      y = y - 20; 
      frame.add(label); 
      frame.revalidate(); 
      frame.repaint(); 
     } 
    } 
} 

In Ihrem Fall ist die revalidate nicht unbedingt erforderlich, da Sie kein Layout-Manager verwenden, aber es ist immer noch eine gute Idee, es zu schließen, da Sie sollten Layout-Manager verwenden als Null-Layouts sind gefährlich und zerbrechlich.

Besser, wenn Sie eine JList verwenden.

z.B.

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

@SuppressWarnings("serial") 
public class ChatClient2 extends JPanel { 
    private static final int VISIBLE_ROW_COUNT = 30; 
    private DefaultListModel<String> listModel = new DefaultListModel<>(); 
    private JList<String> chatList = new JList<>(listModel); 
    private SendAction sendAction = new SendAction("Send"); 
    private JTextField textField = new JTextField(20); 
    private JButton sendButton = new JButton(sendAction); 

    public ChatClient2() { 
     chatList.setFocusable(false); 
     chatList.setVisibleRowCount(VISIBLE_ROW_COUNT); 
     JScrollPane scrollPane = new JScrollPane(chatList); 

     textField.setAction(sendAction); 
     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS)); 
     bottomPanel.add(textField); 
     bottomPanel.add(sendButton); 

     setLayout(new BorderLayout()); 
     add(scrollPane); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private class SendAction extends AbstractAction { 
     public SendAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String text = textField.getText(); 
      listModel.add(0, text); 
      textField.selectAll(); 
      textField.requestFocusInWindow(); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Chat Client2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new ChatClient2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Es hat funktioniert. Vielen Dank. – draner

+0

@draner: Gern geschehen –

Verwandte Themen