GUI - tworzenie obiektu innej klasy

0

Witam,

Stworzyłem dwie klasy. Pierwsza to klasa główna Test, ma za zadanie ustawienie rozmiaru wyświetlanego okna, oraz wyświetlanie tabeli która jest tworzona przez drugą klasę Tabela_16x4. Zwracam się z prośbą, ponieważ nie wiem jak poprawnie dodać tabelę do klasy głównej, utworzyłem obiekt, wywołałem potrzebne metody leczy przy add(Tabela), program się wysypuje. Dodam, że gdy utworzyłem obiekt w klasie Tabela_16x4 i zdefiniowałem rozmiar wyswietlanego okna, wszystko działało poprawnie. Poniżej załączam kody programów wraz z błędami.
Dziękują za wszystkie pouczające odpowiedzi!

Klasa Główna: Test

import javax.swing.JFrame;

public class Test extends JFrame {

	 Tabela_16x4 Tabela;
	
     char bin[][] = { // 16x4 4 przerzutniki
        { '0', '0', '0', '0' },
        { '0', '0', '0', '1' },
        { '0', '0', '1', '0' },
        { '0', '0', '1', '1' },
        { '0', '1', '0', '0' },
        { '0', '1', '0', '1' },
        { '0', '1', '1', '0' },
        { '0', '1', '1', '1' },
        { '1', '0', '0', '0' },
        { '1', '0', '0', '1' },
        { '1', '0', '1', '0' },
        { '1', '0', '1', '1' },
        { '1', '1', '0', '0' },
        { '1', '1', '0', '1' },
        { '1', '1', '1', '0' },
        { '1', '1', '1', '1' }
    };    
	public static void main(String[] args)  {

		Test Program = new Test();
		Program.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Program.setVisible(true);
	}
	
	public Test() // konstruktor
	{
		// Ustawienia Okna
		setSize(1000, 1000);
    	setTitle("Przeliczanie");
    	setLayout(null);
    	
    	// Dodanie Tabeli
        Tabela_16x4 Tabela = new Tabela_16x4();
	    Tabela.Tworz_Tabele(20, 30, "Napis");
	    Tabela.Wypelnij_Tabele(20, 30, 4, 4, bin);
	    add(Tabela);
	}	
}

Lista błędów:

 	at java.awt.Container.checkNotAWindow(Unknown Source)
	at java.awt.Container.addImpl(Unknown Source)
	at java.awt.Container.add(Unknown Source)
	at javax.swing.JFrame.addImpl(Unknown Source)
	at java.awt.Container.add(Unknown Source)
	at Test.<init>(Test.java:44)
	at Test.main(Test.java:28)

Klasa **Tabela_16x4 **

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class Tabela_16x4 extends JFrame{

    JLabel L_Tablica_Nazwa;
	JLabel L_0, L_1, L_2, L_3, L_4, L_5, L_6, L_7, L_8, L_9, L_10, L_11, L_12, L_13, L_14, L_15;
    JLabel L_Q4, L_Q3, L_Q2, L_Q1; 
    static JTextField T_00, T_01, T_02, T_03, T_10, T_11, T_12, T_13, T_20, T_21, T_22, T_23,  T_30, T_31, T_32, T_33,  T_40, T_41, T_42, T_43,  T_50, T_51, T_52, T_53,  T_60, T_61, T_62, T_63,  T_70, T_71, T_72, T_73,  T_80, T_81, T_82, T_83,  T_90, T_91, T_92, T_93,  T_100, T_101, T_102, T_103,  T_110, T_111, T_112, T_113,  T_120, T_121, T_122, T_123,  T_130, T_131, T_132, T_133,  T_140, T_141, T_142, T_143,  T_150, T_151, T_152, T_153;
    JTextField Pole[][];   
    
	public static void main(String[] args) 
	{	

	}
	
	public  Tabela_16x4()
	{		 

// Indeks Wierszy			
			L_0 = new JLabel("  0");
			L_1 = new JLabel("  1");
			L_2 = new JLabel("  2");
			L_3 = new JLabel("  3");
			L_4 = new JLabel("  4");
			L_5 = new JLabel("  5");
			L_6 = new JLabel("  6");
			L_7 = new JLabel("  7");
			L_8 = new JLabel("  8");
			L_9 = new JLabel("  9");
			L_10 = new JLabel("10");
			L_11 = new JLabel("11");
			L_12 = new JLabel("12");
			L_13 = new JLabel("13");
			L_14 = new JLabel("14");
			L_15 = new JLabel("15");
// Indeks Kolumny			
			L_Q1 = new JLabel("Q1");
			L_Q2 = new JLabel("Q2");
			L_Q3 = new JLabel("Q3");
			L_Q4 = new JLabel("Q4");
// POLA TABELI 
			T_00 = new JTextField("");
			T_01 = new JTextField("");
			T_02 = new JTextField("");
			T_03 = new JTextField("");
			T_10 = new JTextField("");
			T_11 = new JTextField("");
			T_12 = new JTextField("");
			T_13 = new JTextField("");
			T_20 = new JTextField("");
			T_21 = new JTextField("");
			T_22 = new JTextField("");
			T_23 = new JTextField("");
			T_30 = new JTextField("");
			T_31 = new JTextField("");
			T_32 = new JTextField("");
			T_33 = new JTextField("");
			T_40 = new JTextField("");
			T_41 = new JTextField("");
			T_42 = new JTextField("");
			T_43 = new JTextField("");
			T_50 = new JTextField("");
			T_51 = new JTextField("");
			T_52 = new JTextField("");
			T_53 = new JTextField("");
			T_60 = new JTextField("");
			T_61 = new JTextField("");
			T_62 = new JTextField("");
			T_63 = new JTextField("");
			T_70 = new JTextField("");
			T_71 = new JTextField("");
			T_72 = new JTextField("");
			T_73 = new JTextField("");
			T_80 = new JTextField("");
			T_81 = new JTextField("");
			T_82 = new JTextField("");
			T_83 = new JTextField("");
			T_90 = new JTextField("");
			T_91 = new JTextField("");
			T_92 = new JTextField("");
			T_93 = new JTextField("");
			T_100 = new JTextField("");
			T_101 = new JTextField("");
			T_102 = new JTextField("");
			T_103 = new JTextField("");
			T_110 = new JTextField("");
			T_111 = new JTextField("");
			T_112 = new JTextField("");
			T_113 = new JTextField("");
			T_120 = new JTextField("");
			T_121 = new JTextField("");
			T_122 = new JTextField("");
			T_123 = new JTextField("");
			T_130 = new JTextField("");
			T_131 = new JTextField("");
			T_132 = new JTextField("");
			T_133 = new JTextField("");
			T_140 = new JTextField("");
			T_141 = new JTextField("");
			T_142 = new JTextField("");
			T_143 = new JTextField("");
			T_150 = new JTextField("");
			T_151 = new JTextField("");
			T_152 = new JTextField("");
			T_153 = new JTextField("");		
			System.out.print("Jestem w konstruktorze");
	}
	
    public void Tworz_Tabele( int wier, int K_Shift, String napis)
	{	
    	System.out.print("Jestem fun. Tworz Tabele");
      	L_Tablica_Nazwa = new JLabel(napis);
		L_Tablica_Nazwa.setBounds(328+K_Shift, wier-50 ,200,20);
		L_Tablica_Nazwa.setForeground(Color.BLUE);
		add(L_Tablica_Nazwa);
	    
		// Wypisuje indeksy wierszy 
		JLabel L_Tab_Y[] = { L_0, L_1, L_2, L_3, L_4, L_5, L_6, L_7, L_8, L_9, L_10, L_11, L_12, L_13, L_14, L_15 };		
		for( int i=0; i<16; i++) 
		{
			L_Tab_Y[i].setBounds(300+K_Shift,wier,200,20);
			add(L_Tab_Y[i]);
			wier+=20;
		}
	
		// Wypisuje indeksy kolumn 
		JLabel L_Tab_X[] = { L_Q4, L_Q3, L_Q2, L_Q1 };
		for( int i=0, kol=325+K_Shift; i<4; i++, kol+=25) // Dodaje numer kolumny w zaleznosci od k
		{   
			L_Tab_X[i].setBounds(kol,wier-350,200,20);
			add(L_Tab_X[i]);
		}		
	}
    
		void Wypelnij_Tabele( int wier, int K_Shift, int w, int k, char bin[][])// wiersz, kolumna 
		{	
			System.out.print("Jestem w fun Wypelnij Tabele");
		     JTextField Pole[][] =  {  // pola Tabeli umieszczone w tablicy 
			            { T_00, T_01, T_02, T_03 },
			            { T_10, T_11, T_12, T_13 },
			            { T_20, T_21, T_22, T_23 },
			            { T_30, T_31, T_32, T_33 },
			            { T_40, T_41, T_42, T_43 },
			            { T_50, T_51, T_52, T_53 },
			            { T_60, T_61, T_62, T_63 },
			            { T_70, T_71, T_72, T_73 },
			            { T_80, T_81, T_82, T_83 },
			            { T_90, T_91, T_92, T_93 },
			            { T_100, T_101, T_102, T_103 },
			            { T_110, T_111, T_112, T_113 },
			            { T_120, T_121, T_122, T_123 },
			            { T_130, T_131, T_132, T_133 },
			            { T_140, T_141, T_142, T_143 },
			            { T_150, T_151, T_152, T_153 },           
			    };
		     
// Wypelnia tabele Polami JTextField oraz wpisuje dane 
				for(int i=0; i<w; i++)
				{ 
					for(int j=0, kol=325+K_Shift; j<k; j++, kol+=25)
					{	
						Pole[i][j].setBounds(kol,wier,25,20);	
						Pole[i][j].setText(String.valueOf(bin[i][j]));
						add(Pole[i][j]);								
					}
					wier+=20;
				}			
	}
}

poprawienie tagów wątku - furious programming

2

Nie możesz umieścić JFrame w JFrame, zamień wiersz

public class Tabela_16x4 extends JFrame{

na

public class Tabela_16x4 extends JPanel{

A poza tym wyrzuć kod klasy Tabela_16X4 przez okno i napisz go na nowo. Fragment napiszę za Ciebie (zmienne T_00 do T_153 są niepotrzebne)

JTextField Pole[][] = new JTextField[16][4];
for(int i=0;i<16;i++)
{
     for(int j=0,kol=325+K_Shift;j<4;j++,kol+=25)
     {
           Pole[i][j] = new JTextField("");
           Pole[i][j].setBounds(kol,wier,25,20);    
           Pole[i][j].setText(String.valueOf(bin[i][j]));
           add(Pole[i][j]);           
     }
     wier+=20;
}
0

Fakt trochę wyszło mi z tego monstrum, dziękuję za pomysł na pewno wykorzystam go w przerabianiu programu. Zastanawia mnie jeszcze jedna rzecz. Myślałem że ustawienie komponentów w programie głównym będzie takie jak w Klasie Tabela_16x4, tym czasem przy dodaniu obiektu tej klasy muszę jeszcze ustawić dodatkowo jego położenie, w innym wypadku tabela w ogolę sie nie wyświetla . Stosuję zatem, ponownie znaną mi funkcję .setBounds(arg0, arg1, arg2, arg3); ale wychodzą mi krzaki jak po lewej stronie. Jakim innym sposobem mogę ustawić tablice aby wyglądała tak jak po prawej stronie ?
Pozdrawiam
user image

1

Jeśli rozmieszczasz komponenty ręcznie (setBounds(...)), to musisz wyłączyć zarządcę rozkładu.

setLayout(null);

w klasie Tabela_16X4 również.

1 użytkowników online, w tym zalogowanych: 0, gości: 1