Dodanie JScrollPane do klasy rozszerzającej JTable

0

Witam chcę sobie stworzyć klasę która rozszerza JTable i potem w panelu tworzę obiekt tej klasy i go dodaję wszystko działa oprócz dodawania JScrollPane (przez o nagłówki się nie wyświetlają). Nie wiem czemu on się nie dodaje

package GUI;

import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MyTable extends JTable{
    static String[] columns = new String[] {"Id", "Name", "Surname", "Age" , "Type"};
    static Object[][] data = new Object[][] {
    	{null, null, null, null, null }
        };
        
    	JScrollPane scroll;
    	
        public MyTable(){
        	super(data,columns);
        	scroll=new JScrollPane();
        	this.add(scroll);
        }

}

 
0

Źle to robisz, najprostszy schemat jest taki:

table = new JTable();
//lub bardziej elastycznie i uniwersalnie
table = new JTable(model);
sp = new JScrollPane(table);
add(sp);
0

Tak robię w klasie Panel który dziedziczy p JPanel i to działa ale chciałem to przenieść do osobnej klasy MyTable która dziedziczy po JTable więc table=new JTable mi nie działa chyba że nie będzie dziedziczyć po JTable

0

Masz złą koncepcję, pomysł by dodawać JScrollPane do JTable jest absurdalny.

0

to całą tabelę powinienem stworzyć w klasie dziedziczącej po JPanel?

package GUI;

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class MyPanel extends JPanel{
	private final Dimension dimension=new Dimension(900,600);
	private final Dimension size=new Dimension(46,46);
	MyButton delete,info,edit;

        MyTable table = new MyTable(); // zamiast tego napisać
//JTable table=new JTable(data,columnsName)
//JScrollPane scroll=new JScrollPane(table)
	public MyPanel(){
		setLayout(new FlowLayout());
		delete=new MyButton("src/Icones/delete.png",size);
		info=new MyButton("src/Icones/info.png",size);
		edit=new MyButton("src/Icones/edit.png",size);
		setPreferredSize(dimension);	
		add(delete);
		add(info);
		add(edit);
		add(table);
               //add(scroll)
	}
}

 
0

Na końcu

add(new JScrollPane(table)); 

Panel będzie wyglądał dość dziwnie - w jednym rzędzie trzy małe przyciski, a potem duża tabela.
Spróbuj tak:

    public MyPanel(){
        setLayout(new BorderLayout());
        JToolBar tb = new JToolBar();
        delete=new MyButton("src/Icones/delete.png",size);
        delete.setTollTipText("Usunięcie czegoś ważnego");
        info=new MyButton("src/Icones/info.png",size);
        edit=new MyButton("src/Icones/edit.png",size);
        //setPreferredSize(dimension);    
        tb.add(delete);
        tb.add(info);
        tb.add(edit);
        add(tb, BorderLayout.NORTH);
        add(new JScrollPane(table),BorderLayout.CENTER);
               //add(scroll)
    } 
0

@bogdans:rozplanowałem to sobie ładnie za pomocą dwóch paneli. Wiesz może jaka jest metoda która zachowuje rozmiar panelu proporcjonalnie jak powiększę okno to się powiększy też panel? Bo obecnie okno ma wymiar 900x600 panel 1 ma wymiar 900x500 a drugi panel 900x500 i jak powiększę okno to wymiary zostają. W qt jest opcja że za pomocą spacerów robię odstęp między blokami który się zmienia proporcjonalnie do okna

EDIT:
Dobra mam jest to GridBagLayout

0

Wiesz może jak ustawić czcionkę w tablicy (całej) obecnie robię to tak

		MyTable.getTableHeader().setFont(new Font("Arial",Font.PLAIN,17));
		MyTable.setFont(new Font("Arial",Font.PLAIN,20));
 

tylko że jak kliknę dwa razy na komórkę to rozmiar do edycji jest standardowy

1

Musisz skorzystać z własnego TableCellEditor.

0

Stworzyłem sobie edytor komórki, chciałem dodać żeby w danej komórce można było wpisać cyfry ten kod działa jeśli mam w panelu obiekt JTextField i tą metodę mam w tej samej klasie, tylko nie wiem jak ją dodać w tym edytorze w którym miejscu by działała

 package GUI;

import java.awt.Component;
import java.awt.Font;
import java.awt.event.KeyEvent;

import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.TableCellEditor;

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor{
	JTextField component=new JTextField();
	
	private void jTextFieldKeyTyped(KeyEvent e){
		char c=e.getKeyChar();
		if(!(Character.isDigit(c)) || (c==KeyEvent.VK_BACK_SPACE) || (c==KeyEvent.VK_DELETE)){
			e.consume();
		}
	}
	
	@Override
	public Object getCellEditorValue() {
		// TODO Auto-generated method stub
		return component.getText();
	}

	@Override
	public Component getTableCellEditorComponent(JTable tab, Object value, boolean isSelected, int rowIndex, int colIndex) {
		// TODO Auto-generated method stub
		component.setText((String)value);
		component.setFont(new Font("Arial",Font.PLAIN,20));
		return component;
	}

}
0

A nie prościej skorzystać z JFormattedTextField?
Przykład:

MaskFormatter  mask = new MaskFormatter("********");
mask.setValidCharacters("-1234567890 ");
JFormattedTextField ftf = new JFormattedTextField(mask);

Do ttf można wpisać najwyżej 8 znaków (długość maski) i tylko cyfry, znak minus lub spację.

0

Teraz prościej jak szukałem to znalazłem z NumberFormat a to mi się wydaje zagmatwane, ale z maską proste :)
Dzięki

0

A mógłbyś mi powiedzieć kiedy jest wywoływana metoda getCellEditorValue z klasy MyTableCellEditor? Bo chcę użyć jednego obiektu tej klasy dla dwóch obiektów klasy JTable i w pierwszej tabeli mam maskę wartości w złotówkach a w drugiej tabeli mam maskę wartości m3, mogę stworzyć dwa różne edytory ale nie wiem czy to będzie wydajne. W środku tego edytora chciałem tworzyć obiekt component z daną maską zależną od tabeli działa mi to tylko dla pierwszej jakiejkolwiek edytowanej komórki potem komórka jest bez maski. Chciałem stworzyć trzy osobne componenty każdy z inną maską tylko nie wiem kiedy wywołuje się metoda getCellEditorValue

 package GUI;

import java.awt.Component;
import java.awt.Font;
import java.text.ParseException;

import javax.swing.AbstractCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.text.MaskFormatter;

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor{
	private JFormattedTextField component;
	private MaskFormatter mask=null;
	private MaskFormatter mask1=null;
	public MyTableCellEditor(){		
		try{
			mask = new MaskFormatter("***** m3");
			mask.setValidCharacters("1234567890, ");
			mask1 = new MaskFormatter("***** zł");
			mask1.setValidCharacters("1234567890, ");
			//component=new JFormattedTextField(mask);
		}catch(ParseException e){
			e.getMessage();
		}
	}
	
	@Override
	public Object getCellEditorValue() {
		// TODO Auto-generated method stub
		return component.getText();
	}

	@Override
	public Component getTableCellEditorComponent(JTable tab, Object value, boolean isSelected, int rowIndex, int colIndex) {
		// TODO Auto-generated method stub
		if((colIndex==5) || (colIndex==6)){
			component=new JFormattedTextField(mask);
		}
		else if(tab.getColumnName(1).equals("Cena")){
			component=new JFormattedTextField(mask1);
		}
		else{
			component=new JFormattedTextField();
		}

		component.setText(((String)value));
		component.setFont(new Font("Arial",Font.PLAIN,20));
		return component;
	}

}
0

Nigdy mnie to pytanie nie dręczyło, po prostu podpinam różne edytory do różnych kolumn, to jest wydajne rozwiązanie.

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