webForumDet fria alternativet

Repaint

Java

6 svar · 335 visningar · startad av toba

Medlem sedan jan. 20059 inlägg
Frågan#1

Hej
Jag har ett klientprogram med ett GUI som bla. innehåller en JPanel, den skickas till en annan klass som tar hand om all kommunikation med servern. Jag laddar ner en lista övar andra användare på servern som jag presenterar som JTextFields i JPanelen. Problemet är att JTextFielden inte syns förän man ändrar storlek på fönstret. Jag antar att probemet är att anropa repaint i huvudklassen från en annan klass. Nån som har en lösning?

Medlem sedan maj 20012 237 inlägg
#2

Ach, jag har haft samma problem.

För att dynamiskt lägga till en JPanel i en JFrame med en knapptryckning:

Pröva att kommentera bort validate() i actionPerformed() och tryck sedan på knappen...


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

public class RepaintDemo extends JFrame implements ActionListener
{
	public RepaintDemo()
	{

		JButton btn = new JButton("Add panel");
		btn.addActionListener(this);
		getContentPane().add(btn, BorderLayout.NORTH);

		setBounds(0,0, 400,300);
		setVisible(true);

	}

	public void actionPerformed(ActionEvent e)
	{
		getContentPane().add(createPanel(), BorderLayout.CENTER);
		validate();

	}

	public JPanel createPanel()
	{
		JPanel p = new JPanel();

		JTextField tf = new JTextField("sss");
		p.add(tf);
		return p;
	}

	public static void main(String[]args)
	{
		new RepaintDemo();
	}
}
Medlem sedan maj 20012 237 inlägg
#3

Ovanstående exempel ersätter den gamla JPanelen med en ny varje gång man trycker på knappen. Detta är kanske inte vad du vill ha.

Det är lätt fixat.

I metoden actionPerformed() kör du istället:

p.add(new JTextField("text") ); // se till att p är synlig för denna metod, du måste nästan ha den som en klass-variabel
validate();

Medlem sedan jan. 20059 inlägg
#4

Mitt problem är dock att det rör sig om två olika klasser, en som skapar JPanelen och en som lägger till JTextFields i den. Lägger jag till JTextfields i samma klass som jag skapar JPanelen så är det inga problem, men det passar inte in i min programstruktur.

Medlem sedan maj 20012 237 inlägg
#5

Om klassen som lägger til JPanelen ärver från JFrame så bör det räcka om du anropar validate() på den.

Dvs den andra klassen lägger till en ny JTextField och anropar sedan den andra klassens metod validate().

Pröva detta. Här så fungerar det iaf.

Medlem sedan jan. 20059 inlägg
#6

Fungerar utmärkt. Tack så mycket.

Medlem sedan sep. 2001961 inlägg
#7

Grafik i program är en styggelse. Jag tycker vi alla lovar och svär på att aldrig göra ett GUI. Om man inte kan hantera ett CLI med 50 parametrar ska man inte röra en dator... ;-)

307 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
135 ms — deklarationer (db)
0 ms — hämta statistik (cache)
169 ms — hämta tråd, inlägg och bilagor (db)
133 ms — ändringar (db)