webForumDet fria alternativet

Knapp som visar och döljer textfält?

5 svar · 297 visningar · startad av Poppe25

Poppe25Medlem sedan apr. 2002255 inlägg
#1

Hej, hur skriver man en klass som skapar ett JFrame-fönster innehållandes en knapp som visar och döljer ett textfält (eller annan komponent)?

jmeMedlem sedan maj 20012 237 inlägg
#2

Den här klassen skapar en JButton samt en JTextArea.
Om du trycker på knappen så visas/göms textarean...


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

public class Test extends JFrame implements ActionListener
{
	JButton btn;
	
	JTextArea area;
	
	boolean show = true;
	
	public Test()
	
	{
		super();
		
		btn = new JButton("Tryck mig!");
		btn.addActionListener(this);
		
		getContentPane().add(btn, BorderLayout.NORTH);	
		
		area = new JTextArea();
		
		getContentPane().add(area, BorderLayout.CENTER);
		setBounds(0,0, 800,600);
		setVisible(true);
		
		
	}
	
	public void actionPerformed(ActionEvent e)
	{
		JButton src = (JButton)e.getSource();
		
		if(src.equals(btn) )
		{
			if(show == true)
			{
				area.setVisible(false);
				show = false;	
			}
			else
			{
				area.setVisible(true);
				show = true;
			}
		}	
	}
	
	public static void main(String[] arsg)
	{
		new Test();	
	}
			
}
Poppe25Medlem sedan apr. 2002255 inlägg
#3

Tack, fungerar perfekt. Nu har jag hört att ett textfält kan ha flera särskilda lyssnare, säg om jag vill att när man dubbelklickar på textfältet så försvinner det, och när jag trycker på knappen så dyker textfältet upp, hur skulle det se ut?

jmeMedlem sedan maj 20012 237 inlägg
#4

Jepp, rätt så enkelt.

Du får helt enkelt implementera interface:t MouseListener och dessutom implementera dess metoder:

Du kan implementera flera interface i samma klass som du separerar med ett komma-tecken:

public class Olle implements InterfaceX, InterfaceY osv...
{

}
public void mouseClicked(MouseEvent e)  {  }
public void mouseEntered(MouseEvent e)  { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) 
{ 

}
public void mouseReleased(MouseEvent e)  { }

sedan så måste du koppla MouseListener till den valda objektet, dvs JTextArea area:

area.addMouseListener(this);

Några ändringar måste du göra i koden;

I metoden mousePressed() så måste du lägga in några rader för att göra textarean osynlig. Detta gör du med:

area.setVisible(false);

Om du vill att textarean döljs enbart om man dubbel-klickar så kan du anropa metoden getClickCount() som du hittar in variabeln MouseEvent e som du hittar som argument i metoden mousePressed():

if(e.getClickCount() == 2)
{
// dölj textarean...
}

sedan så måste du ändra i metoden actionPerformed():

area.setVisible(true);

Nu så fungerar denna ActionListener enbart med knappen btn.

Vill du att samma lyssnare skall kunna lyssna på helt olika objekt så måste du i metoden actionPerformed() först kontrollera vad det är för typ av objekt just då och då kan du göra såhär


	public void actionPerformed(ActionEvent e)
	{
		Object o = (Object)e.getSource();
		
                                // är det en knapp?
		if(o instanceof JButton)
		{
			JButton src = (JButton)o;
			if(src.equals(btn) )
			{
				area.setVisible(true);
			}	
		}
		// eller är det en JPanel?
		if(o instanceof JPanel)
		{
			JPanel src = (JPanel)o;
			
			
		}
	}

Denna exempel fungerar givetvis bara ifall du har skapat en JPanel och som till du har kopplat en MouseListener till.

PhorpherMedlem sedan feb. 20002 300 inlägg
#5

Buttons kan du sätta actionCommand på och på det sättet identifiera vilken knapp som triggade actionPerformed.

button.setActionCommand("HIDE");

...

public void actionPerformed(ActionEvent e)
{
    if(e.getActionCommand().equals("HIDE"))
    {
        ...
    }
}
Poppe25Medlem sedan apr. 2002255 inlägg
#6

Stort tack för hjälpen!
Det fungerar utmärkt.

129 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)