2009-07-16 19 views
0

Ich habe eine JFrame in denen gibt es 2 Textfelder und 1 JButton. Benutzer müssen eine Zeichenfolge in das Textfeld eingeben. Wenn der Benutzer auf die Schaltfläche im JFrame klickt, werden diese Zeichenfolgen in einer JTable angezeigt. Ich bekomme nicht den Code, den ich mit einem Klick schreiben soll. Bitte hilf mir.Ereignis mit der Schaltfläche klicken

+2

Was Sie bisher bekommen haben? – seth

+1

Noch einmal stellen Sie eine Frage, die im Swing-Tutorial behandelt wird. Sie haben den Link zu diesem Tutorial zahlreiche Tims gegeben. Beginnen Sie mit dem Lesen des Tutorials und veröffentlichen Sie Ihren Code, wenn Sie ein Problem haben. Ich für meinen Teil weiß nicht, ob Ihr Problem damit zusammenhängt, a) auf eine Schaltfläche zu klicken, b) Text aus den Textfeldern abzurufen, c) eine Zeile zur Tabelle hinzuzufügen. Erwarten Sie nicht, dass wir raten, was Sie fragen, und erwarten Sie nicht, dass die Leute Ihnen ständig die Antwort geben – camickr

Antwort

2

Betrachten Sie die Methode void addActionListener(ActionListener l). Das Javadoc der spezifischen Klasse hilft oft auch: Java API

0

Sie müssen ActionListener zu der Schaltfläche hinzufügen. Versuchen Sie, auf Google zu suchen. für jetzt können Sie in diesen Link schauen Jbutton example

2

Ihre Beschreibung ist ein bisschen zu vage für eine gute Antwort, aber ich vermute, der Schritt, den Sie vermissen, ist das Hinzufügen eines Aktion Listener auf die Schaltfläche. Dies wird z.B. in Sun's Swing tutorials. Ich persönlich mag es nicht, ihren Stil und bevorzugen anonyme innere Klassen selbst:

myButton.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
    callMyMethod(); 
    } 
} 

So oder so funktioniert, ich die anonymen inneren Klassen bevorzugen, da sie die Dinge vor Ort zu halten und vermeiden, dass die massiven Switch Methode, die Sie sonst bekommen.

+2

Das wichtige Ding hier "CallMyMethod()". Schreiben Sie die Logik nicht in den Aktionslistener, sondern rufen Sie eine Methode auf, in der Sie Ihre Logik definieren (möglicherweise sogar in einer anderen Controller-Klasse). – Juri

+0

Ich hatte tatsächlich diesen zusätzlichen Kommentar in der ursprünglichen Antwort geschrieben, entschied mich dann aber für die Kürze :-) Vielleicht sollte ich nicht haben. Ich neige dazu, den Inhalt von actionPerformed auf ungefähr eine Zeile herunterzuhalten (eine Zeile in> 90%, die gelegentliche "get X from event, dann ruft die Methode" ein). –

0

zu Lernzwecken:

import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.GroupLayout.Alignment; 
import javax.swing.table.AbstractTableModel; 

public class NameGUI extends JFrame { 
    class NamePair { 
     String firstName; 
     String lastName; 
    } 

    class NameModel extends AbstractTableModel { 
     List<NamePair> names = new ArrayList<NamePair>(); 

     @Override 
     public String getColumnName(int column) { 
      switch (column) { 
      case 0: 
       return "First name"; 
      case 1: 
       return "Last name"; 
      } 
      return ""; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public int getRowCount() { 
      return names.size(); 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      switch (columnIndex) { 
      case 0: 
       return names.get(rowIndex).firstName; 
      case 1: 
       return names.get(rowIndex).lastName; 
      } 
      return null; 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return true; 
     } 

     @Override 
     public void setValueAt(Object value, int rowIndex, int columnIndex) { 
      switch (columnIndex) { 
      case 0: 
       names.get(rowIndex).firstName = String.valueOf(value); 
       break; 
      case 1: 
       names.get(rowIndex).lastName = String.valueOf(value); 
       break; 
      } 
     } 

    } 

    JTextField firstName; 
    JTextField lastName; 
    JButton addName; 
    JTable nameTable; 
    NameModel nameModel; 

    public NameGUI() { 
     super("My GUI"); 
     Container c = getContentPane(); 
     GroupLayout gl = new GroupLayout(c); 
     c.setLayout(gl); 
     gl.setAutoCreateContainerGaps(true); 
     gl.setAutoCreateGaps(true); 
     firstName = new JTextField(20); 
     lastName = new JTextField(20); 
     addName = new JButton("Add name"); 
     // MAGIC STARTS ********************* 
     addName.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       onButtonClick(); 
      } 
     }); 
     // MAGIC ENDS *********************** 
     nameModel = new NameModel(); 
     nameTable = new JTable(nameModel); 
     JScrollPane nameTableScroll = new JScrollPane(nameTable); 

     gl.setHorizontalGroup(
      gl.createParallelGroup() 
      .addGroup(
       gl.createSequentialGroup() 
       .addComponent(firstName) 
       .addComponent(lastName) 
       .addComponent(addName) 
      ) 
      .addComponent(nameTableScroll) 
     ); 
     gl.setVerticalGroup(
      gl.createSequentialGroup() 
      .addGroup(
       gl.createParallelGroup(Alignment.BASELINE) 
       .addComponent(firstName) 
       .addComponent(lastName) 
       .addComponent(addName) 
      ) 
      .addComponent(nameTableScroll) 
     ); 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
    } 

    private void onButtonClick() { 
     NamePair np = new NamePair(); 
     np.firstName = firstName.getText(); 
     np.lastName = lastName.getText(); 
     nameModel.names.add(np); 
     nameModel.fireTableDataChanged(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new NameGUI().setVisible(true); 
      } 
     }); 
    } 

} 
Verwandte Themen