JPanel auf ein JFrame legen und Buttons mit Actionlistener

Toupman

Grünschnabel
Hi,
ich mß bis Montag einen Taschenrechner in einem Swing Fenster erstellen, das ist so allein nicht das Problem, allerdings muß ich das ganze in Eclipse machen, damit kenn ich mich schon mal gar nicht aus. Das andere und an sich größere Problem ist das ich das Main nicht einfach in ein JFrame packen kann sondern das soll in nem JPanel liegen das dann auf ein JFrame aufgesetzt ist, so in etwa:

Code:
import java.awt.Graphics;
import javax.swing.*;

class DrawFirstLine extends JPanel
{
  protected void paintComponent( Graphics g )
  {
    super.paintComponent( g );

    g.drawLine( 10, 10, 100, 50 );
  }

public static void main( String args[] )
  {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize ( 100, 100 );
    f.add( new DrawFirstLine() );
    f.setVisible( true );
  }
}

Nun krieg ich es aber leider nicht hin das das ganze mit Buttons funktioniert.
Wie kann ich es jetzt machen das in der Klasse (hier: DrawfFirstLine) Buttons mit Actionlistener sind?

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

class Rechner extends JPanel
{
}  
  public class Zahlen extends JPanel
  {

  }
  
  public class Display extends JPanel
  {
	  
  }
  
  public class OperationenLinks extends JPanel
  {
	  
  }
  
  public class OperationenRechts extends JPanel
  {
	  
  }
  
  
public static void main( String args[] )
  {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setLayout( new BorderLayout(5, 5) );
    f.add( Display(), BorderLayout.NORTH );
    f.add( OperationenLinks(), BorderLayout.EAST );
    f.add( OperationenRechts(), BorderLayout.WEST );
    f.add( Zahlen(), BorderLayout.CENTER);
    f.setSize ( 350, 215 );
    f.setVisible( true );
  }

So in etwa hab ich mir das gedacht, jetzt wollte ich halt in die classes Zahlen, Display, usw. das ZahlenTastenfeld , das Display usw. ablegen und dann die Panels einzeln einfügen. Das Problem ist nur das nichts so funktioniert wie ich mir das vorgestellt hab.


Bin echt am verzweifeln! :confused: :confused: :confused:



MfG



Toupman
 
Zuletzt bearbeitet:
Um die Actionlistener zu implementieren, solltest du in deinem Beispiel das Interface ActionListener einbinden

Code:
import javax.swing.*;
import javax.swing.event.*;

public class ButtonPanels extends JPanel implements ActionListener {

/** the first Button */
private JButton jBtnButton1 = null;
/** the second Button */
private JButton jBtnButton2 = null;

/** 
*the Constructor
*/
public ButtonPanels() {
  super();
  init();
}

/**
*inits the Panel
*/
private init() {
  this.jBtnButton1 = new JButton();
  this.jBtnButton1.setText("Button1");
  this.jBtnButton1.setBounds(10,10,100,21);
  this.jBtnButton1.setActionCommand("btn1Click");
  this.jBtnButton1.addActionListener(this);
  this.jBtnButton2 = new JButton();
  this.jBtnButton2.setText("Button2");
  this.jBtnButton2.setBounds(50,50,100,21);
  this.jBtnButton2.setActionCommand("btn2Click");
  this.jBtnButton2.addActionListener(this);
}

/**
* Actionlistener for jBtnButton1 and jBtnButton2
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
  if(e.getActionCommand().equals("btn1Click")) {
    //TODO: add Stuff for jBtnButton1 
  }
  if(e.getActionCommand().equals("btn2Click")) {
    //TODO: add Stuff for jBtnButton2
  }


}
 
Vielen Dank, aber ich habs nach ner Nachtschicht dann noch selbst hinbekommen!

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

class RechnerGUI extends JFrame
{
	private final Font BIGGER_FONT = new Font("monspaced", Font.PLAIN, 20);//Erstellen einer eigenen Schriftart
	
	private JTextField m_displayField;//Deklarierung eines Textfeldes
	
	private boolean   m_startNumber = true;//Deklarierung wichtiger Variablen
	private double 	  n1 = 0;
	private String    m_previousOp  = "=";
    
	private Rechenwerk m_logic = new Rechenwerk();//Erstellen eines Objektes der Klasse Rechenwerk
       
    public RechnerGUI()
	{
		m_displayField = new JTextField("0", 25);//Erstellen des Display-Textfeldes
        m_displayField.setHorizontalAlignment(JTextField.RIGHT);//Ausrichtung des Textes innerhalb des Feldes
        m_displayField.setFont(BIGGER_FONT);//Setzen der Schriftart
        
        
        JButton clearButton = new JButton("CLEAR");//Erstellen der "Clear" Buttons
        clearButton.setFont(BIGGER_FONT);//Setzen der Schriftart
        clearButton.addActionListener(new ClearListener());//Zuweisen des Actionlisteners
        
        
        
        
        
        
        ActionListener numListener = new NumListener();//Erstellen eines Objektes der Listenerklasse "Numlistener"
		
		String[] buttonOrder = {"7","8","9","4","5","6","1","2","3","+/-","0","."};//Erstellen des Stringfeldes
		JPanel Zahlen = new JPanel();//Erstellen des JPanels "Zahlen"
		Zahlen.setLayout(new GridLayout(4, 3, 5, 5));//Setzen des Panellayouts
		for (int i = 0; i < buttonOrder.length; i++)//Initialisierung der for-Schleife zum erstellen der Zahlenbutton 
			{
          	JButton b = new JButton(buttonOrder[i]);//Erstellen der einzelnen Button  
            b.addActionListener(numListener);//Zuweisen der jeweiligen Listener
            b.setFont(BIGGER_FONT);//Setzen der Schriftart
            Zahlen.add(b);//Hinzufügen des jeweiligen Buttons zum PanelObjekt "Zahlen
			}
        
        ActionListener opListener = new OpListener();//Erstellen eines Objektes der Listenerklasse "OpListener"  
          	
        String[] opOrder = {"+", "-", "*", "/", "x^y", "sqrt", "=", "1/x"};//Erstellen des Stringfeldes
        JPanel Operationen = new JPanel();//Erstellen des JPanels "Operationen"
        Operationen.setLayout(new GridLayout(4, 2, 5, 5));//Setzen des Panellayouts
        for (int j = 0; j < opOrder.length; j++)//Initialisierung der for-Scheife zum erstellen der Operationenbutton 
         	{
            JButton b = new JButton(opOrder[j]);//Erstellen der einzelnen Button
            b.addActionListener(opListener);//Zuweisen der jeweiligen Listener
            b.setFont(BIGGER_FONT);//Setzen der Schriftarten
            Operationen.add(b);//Hinzufügen des jeweiligen Buttons zum PanelObjekt "Operationen"
         	}
        JPanel content = new JPanel();//Erstellen des Hauptpanels "content"
        content.setLayout(new BorderLayout(5, 5));//Setzen des Panellayouts
        content.add(m_displayField, BorderLayout.NORTH );//Hinzufügen des Displays in das Hauptpanel
        content.add(Zahlen, BorderLayout.WEST);//Hinzufügen des Zahlenpanels in das Hauptpanel
        content.add(Operationen, BorderLayout.EAST  );//Hinzufügen des Operationenpanels in das Hauptpanel
        content.add(clearButton, BorderLayout.SOUTH );//Hinzufügen des "Clear"-Buttons in das Hauptpanel		
		 
        this.setContentPane(content);//Aufsetzen des Hauptpanels auf das JFrame-Fenster 
        this.pack();
        this.setTitle("Rechner v1.0");//Setzen des Fenstertitels
        this.setResizable(false);//Verbieten der Größenäderung
		}
	
	
	
        

    private void action_clear()//Erstellen der Methode action_clear
	{
    m_startNumber = true;//Rücksetzen der m_startNumber Variable
    m_displayField.setText("0");//Rücksetzen des Displays
    m_previousOp  = "=";//Rücksetzen der m_previousOp Variable
    m_logic.setTotal(0);//Rücksetzen des Wertes im Objekt der Rechenwerkklasse
	}
 
    
class ClearListener implements ActionListener//Erstellen der Actionlistenerklasse "Clearlistener"
	{
    public void actionPerformed(ActionEvent e) 
    	{
        action_clear();
        }
    }
 
    
class NumListener implements ActionListener//Erstellen der Actionlistenerklasse "Numlistener"
 	{
    public void actionPerformed(ActionEvent e) 
    	{
        String digit = e.getActionCommand();//Auslesen der gedrückten Taste
        if ( digit == "+/-")//Behandlung des Spezialfalls der Negation
        	{
       	 	String displayText1 = m_displayField.getText();
       	 	n1 = Double.parseDouble(displayText1);
        	m_logic.setTotal(n1);
       	 	m_logic.neg();
   		 	m_displayField.setText("" + m_logic.getTotalString()); 
   		 	m_startNumber = true;
   		 	m_previousOp = e.getActionCommand();
        	}
        else
        {
        	if (m_startNumber)//Feststellung ob erste Ziffer
        	{
            m_displayField.setText(digit);//Einfügen der ersten Ziffer und geichzeitiges leeren des Stingfeldes
            m_startNumber = false;//Anderung der Variablen, damit nicht eine weitere erste Ziffer geschrieben wird
        	} 
        	else 
        	{
            m_displayField.setText(m_displayField.getText() + digit);//Anhängen der weiteren Ziffern an das Stringfeld
        	}
        }
    	}
	}
 

class OpListener implements ActionListener//Erstellen der Actionlistenerklasse OpListener 
 {
     public void actionPerformed(ActionEvent e) 
     {
    	 String displayText1 = m_displayField.getText();//Auslesen des Displays
    	 n1 = Double.parseDouble(displayText1);//Umwandlung des Strings in eine double Zahl
    	 if (m_previousOp.equals("sqrt"))//Vergleich der gedrückten Taste mit den jeweiligen Operatoren 
    		 {
    		 m_logic.sqrt(n1);//Aufruf der jeweiligen Methode des Objekts der Klasse Rechenwerk
    		 }
    	 else if (m_previousOp.equals("1/x"))
    		 {
    		 m_logic.oneDivide(n1);
    		 }
    	 else if (m_previousOp.equals("="))
    		 {
    		 m_logic.setTotal(n1);
    		 }
    	 else if (m_previousOp.equals("+"))
    		 {
    		 m_logic.add(n1);
    		 }
    	 else if (m_previousOp.equals("-"))
    		 {
    		 m_logic.subtract(n1);
    		 }
    	 else if (m_previousOp.equals("*"))
    		 {
    		 m_logic.multiply(n1);
    		 }
    	 else if (m_previousOp.equals("/"))
    		 {
    		 m_logic.divide(n1);
    		 }
    	 else if (m_previousOp.equals("x^y"))
    		 {
    		 m_logic.xpowery(n1);
    		 }
    	 
    	 
    		 m_displayField.setText("" + m_logic.getTotalString());//Ausgabe des Ergebnisses in das Display 
    		 m_startNumber = true;//Setzen der Variablen um das eingeben der Nächsten Zahl zu ermöglichen
             m_previousOp = e.getActionCommand();//Rücksetzen der m_previousOp Variable
        
     }
 }
}

Trotzdem, vielden Dank!


MfG


Toupman
 
Hi,
meinTascenrechner ist jetzt soweit fertig, aber es gibts noch zwei kleinere Probleme.
Die einzigen zwei Sachen die mir noch nicht gefallen ist die Größe der JButtons, die hätte ich gern was kleiner, dazu muß man wissen das die JButtons nach Gruppen sortiert auf verschiedenen JPlanes sitzen und dann alle auf einem MainPlane das dann auf ein JFrame gesetzt ist, wenn ich die JFramegröße ändere, ändert sich die Buttongröße nicht und es wird immer nur ein Teilbereich des Rechners angezeigt.
Das andere was mich noch stört ist das ich gerne das Numpad zum rechnen benutzen möchte so wie beim Windows Rechner. Momentan schreibt der halt immer alles was man auf der Tastatur eingibt in das Display JTextField. Ich hätte das gerne so das der die Tastatureingabe überprüft bevor das angezeigt wird und das dann Zeichenabhängig entschieden wird was passiert, so möchte ich z.B. das wenn man ein Komma eingibt statt dessen ein Punkt in das Textfeld geschrieben wird.


MfG



Toupman

P.S.: Ist dringend! Am Montag ist Abgabe und in meinem Buch "Java ist auch eine Insel" find ich nichts passendes!
 
Also mit set.Size gehts leider nicht, das hab ich schon rausgefunden, wenn jedem button jedem Panel und dem Frame eine größe zugeordnet ist in die die enthaltenen Objekte auch reinpassen würden verändert sich im Layout gar nichts.
Wichtiger wäre mir aber fast das mit dem NumPad, ich hab schon an ein JTextFormattedField gedacht, aber da sieht man den text den man eingibt ja immer direkt.


MfG



Touman
 
Hi,
1: Deine Buttons hängen vom Layout ab. Ich empfehle immer GridBagLayout, fürchte aber, dass Du damit bis Montag nicht klar kommen wirst, ist nicht einfach zu verstehen.
2. JTextField: Hinterlege diesem ein Document (textField.setDocument(...)). Bastel Dir eine eigene Klasse, die von PlainDocument abgeleitet ist und die Methode insertString (des Interfaces Document) gemäß Deinen Wünschen implementiert. Beispiele solltest Du hier im Forum finden.
 
So ich hab jetzt alles in einem Gridlayout, aber wie ändert man jetzt die Größe?
Ich hab mich an dem Beispiel aus "java ist auch ein Insel" orientiert und das sieht so aus:

Code:
 JPanel content = new JPanel();//Erstellen des Hauptpanels "content"
        GridBagLayout gbl = new GridBagLayout();
        content.setLayout( gbl );

        //                                            x  y  w  h  wx   wy
        addComponent( content, gbl, m_displayField,   0, 0, 7, 1, 1.0, 0   );
        addComponent( content, gbl, m_memoryLabel,    0, 1, 1, 1, 0  , 0   );
        addComponent( content, gbl, backSpace,        2, 1, 3, 1, 0  , 0   );
        addComponent( content, gbl, clearButton, 	  5, 1, 2, 1, 0  , 0   );

und so werden die einzelnen Buttons hinzugefügt

Code:
int xz = 3;
int yz = 0;
for (int i = 0; i < buttonOrder.length; i++)//Initialisierung der for-Schleife zum erstellen der Zahlenbutton 
{
JButton b = new JButton(buttonOrder[i]);//Erstellen der einzelnen Button  
b.addActionListener(numListener);//Zuweisen der jeweiligen Listener
b.setFont(BIGGER_FONT);//Setzen der Schriftart
addComponent(content, gbl, b, ((xz%3)+2), ((int) Math.floor(yz/3)+2) , 1,1,0,0);
xz++;
yz++;
}


Wo muß ich jetzt die größe, wie ändern?
 
Zurück