webForumDet fria alternativet

Repaint

6 svar · 335 visningar · startad av toba

tobaMedlem sedan jan. 20059 inlägg
#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?

jmeMedlem 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();
	}
}
jmeMedlem 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();

tobaMedlem 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.

jmeMedlem 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.

tobaMedlem sedan jan. 20059 inlägg
#6

Fungerar utmärkt. Tack så mycket.

LimeMedlem 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... ;-)

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