Komponente zur Laufzeit erstellen

Durch ein JScrollPane.
Hier mal schnell aus einen meiner Projekte:

Java:
public static void run(List<Cmd> list, OptionsWindow optionsWindow)
{
	JPanel panel = new JPanel();
	panel.setLayout(null);
	panel.setPreferredSize(new Dimension(900, list.size() * 30 + 20));

	int listlenght = list.size();
	JLabel[] cmdLabels = new JLabel[listlenght];
	JLabel[] pathLabels = new JLabel[listlenght];
	JLabel[] parmLabels = new JLabel[listlenght];

	JTextField[] cmdFields = new JTextField[listlenght];
	JTextField[] pathFields = new JTextField[listlenght];
	JTextField[] parmFields = new JTextField[listlenght];
	
	EditButton[] editButtons = new EditButton[listlenght];
	DelButton[] delButtons = new DelButton[listlenght];

	BrowseButton[] browseButtons = new BrowseButton[listlenght];
	OKButton[] okButtons = new OKButton[listlenght];
	
	for(int i = 0; i < list.size(); i++)
	{
		cmdLabels[i] = new JLabel();
		cmdLabels[i].setText(list.get(i).getCommand());
		cmdLabels[i].setSize(100, 9);
		cmdLabels[i].setLocation(20, i * 30 + 20);
		panel.add(cmdLabels[i]);
		
		pathLabels[i] = new JLabel();
		pathLabels[i].setText(list.get(i).getPath());
		pathLabels[i].setSize(300, 9);
		pathLabels[i].setLocation(150, i * 30 + 20);
		panel.add(pathLabels[i]);
		
		parmLabels[i] = new JLabel();
		parmLabels[i].setText(list.get(i).getParm());
		parmLabels[i].setSize(100, 9);
		parmLabels[i].setLocation(470, i * 30 + 20);
		panel.add(parmLabels[i]);
		///////
		cmdFields[i] = new JTextField();
		cmdFields[i].setSize(100, 19);
		cmdFields[i].setLocation(20, i * 30 + 20 - 5);
		cmdFields[i].setVisible(false);
		panel.add(cmdFields[i]);
		
		pathFields[i] = new JTextField();
		pathFields[i].setSize(300, 19);
		pathFields[i].setLocation(150, i * 30 + 20 - 5);
		pathFields[i].setVisible(false);
		panel.add(pathFields[i]);
		
		parmFields[i] = new JTextField();
		parmFields[i].setSize(100, 19);
		parmFields[i].setLocation(470, i * 30 + 20 - 5);
		parmFields[i].setVisible(false);
		panel.add(parmFields[i]);
		///////
		editButtons[i] = new EditButton(i, optionsWindow);
		editButtons[i].setSize(100, 15);
		editButtons[i].setLocation(600, i * 30 + 20 - 3);
		panel.add(editButtons[i]);
		
		delButtons[i] = new DelButton(i, optionsWindow);
		delButtons[i].setSize(100, 15);
		delButtons[i].setLocation(730, i * 30 + 20 - 3);
		panel.add(delButtons[i]);
		///////
		browseButtons[i] = new BrowseButton(i, optionsWindow);
		browseButtons[i].setText("Browse");
		browseButtons[i].setSize(100, 15);
		browseButtons[i].setLocation(600, i * 30 + 20 - 3);
		browseButtons[i].setVisible(false);
		panel.add(browseButtons[i]);
		
		okButtons[i] = new OKButton(i, optionsWindow);
		okButtons[i].setText("OK");
		okButtons[i].setSize(100, 15);
		okButtons[i].setLocation(730, i * 30 + 20 - 3);
		okButtons[i].setVisible(false);
		panel.add(okButtons[i]);
	}
	
	JScrollPane scrollPane = new JScrollPane(
			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
			JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
	scrollPane.setViewportView(panel);
	scrollPane.setBackground(Color.blue);
	scrollPane.setLocation(20, 20);
	scrollPane.setSize(900, 8 * 30 + 50);
	
	optionsWindow.setCmdLabels(cmdLabels);
	optionsWindow.setPathLabels(pathLabels);
	optionsWindow.setParmLabels(parmLabels);
	
	optionsWindow.setCmdFields(cmdFields);
	optionsWindow.setPathFields(pathFields);
	optionsWindow.setParmFields(parmFields);
	
	optionsWindow.setEditButtons(editButtons);
	optionsWindow.setDelButtons(delButtons);
	optionsWindow.setBrowseButtons(browseButtons);
	optionsWindow.setOkButtons(okButtons);
	
	JScrollPane oldPane = optionsWindow.getScrollPane();
	if(oldPane != null)
		optionsWindow.remove(oldPane);		
	optionsWindow.add(scrollPane); 
	optionsWindow.setScrollPane(scrollPane);
}

Ist zum editieren Strings aus einen Objekt.

Zuerst wird ein JPanel angelegt, wichtig ist "setPreferredSize()" und nicht "setSize()" zu verwenden sonst funktioniert es nicht. Keine Ahnung warum, war das erste und einzige mal dass ich eines verwendet habe. Als Größe gibtst du das an, was es tatsächlich haben soll, also inkl. des nicht sichtbaren Bereiches.

Dann werden die Arrays wie bei dem was ich vorhin geschrieben habe angelegt. Dann halt Schleife, die alle Objekte erstellt.

Dann wird die JScrollPane angelegt. Die Parameter sagen, dass immer eine vertikale (nach oben/unten) ScrollBar angezeigt werden soll, auch wenn sie nicht gebraucht wird, und niemals eine horenziontale. Danach sagt man, dass das Panel darin angezeigt werden soll. Danach die Hintergrundsfarbe, warum weiß ich auch nicht mehr, und dann halt Größe und Positionen.
Dann werden die Arrays im OptionsWindow in Klassenvariablen geschrieben, geprüft ob schon eine JScrollBar existiert, tut sie es wird sie entfernt, danach wird die neue hinzugefügt.
 
Das klappt noch nicht so ganz. Ich habe jetzt versucht in die Klasse "BuildForm" ein ScrollPanel einzufügen und die Buttons dann zum Panel zu "adden":


Code:
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JScrollPane;
 
public final class BuildForm extends Object
{
    public BuildForm()
    {
        super();
    }
    public final static void run(int i, JButton[] buttonArray, Kiloui kiloui)
    {
        Listener l = new Listener(buttonArray);
        
        JScrollPane scrollPane = new JScrollPane(
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setBackground(Color.blue);
        scrollPane.setLocation(20, 20);
        scrollPane.setSize(500,500);
                
        kiloui.add(scrollPane);
        
        
        for(int j = 0; j < i; j++)
        {
            buttonArray[j] = new JButton();
            buttonArray[j].setText("Button ".concat(String.valueOf(j)));
            buttonArray[j].setLocation(20, 30 * j + 10);
            buttonArray[j].setSize(100, 20);
            buttonArray[j].addActionListener(l);
            
            scrollPane.add(buttonArray[j]);
        }
        
    }
}


Problem1: Die Scrollleiste bleibt "deaktiviert". Ich kann also nicht runterscrollen obwohl insgesamt 100 Buttons erstellt wurden, Wenn ich die Größe des Panals mittels "setsize()" hochsetze dann verschwindet das Panel aus dem unteren Rand des Fensters und die Scrollleiste bleibt an sich immer noch deaktiviert.
Wenn ich ".setPreferedSize()" nutze tut sich garnichts.

Problem2: Nur der erste und letzte Button auf dem Panel sind sichtbar. Die anderen sieht man erst wenn man mit der Maus kurz drüber fährt. (s. Anhang)
 

Anhänge

  • Aufzeichnen.JPG
    Aufzeichnen.JPG
    23,5 KB · Aufrufe: 41
Morgen.

Java:
public final static void run(int i, JButton[] buttonArray, Kiloui kiloui)
{
    Listener l = new Listener(buttonArray);
    
    JPanel panel = new JPanel();
    panel.setLayout(null);
    panel.setPreferredSize(new Dimension(500, 30 * i + 20));        
    
    for(int j = 0; j < i; j++)
    {
        buttonArray[j] = new JButton();
        buttonArray[j].setText("Button ".concat(String.valueOf(j)));
        buttonArray[j].setLocation(20, 30 * j + 10);
        buttonArray[j].setSize(100, 20);
        buttonArray[j].addActionListener(l);
        
        panel.add(buttonArray[j]);
    }
    
    JScrollPane scrollPane = new JScrollPane(
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    scrollPane.getViewport().setView(panel);
    scrollPane.setBackground(Color.blue);
    scrollPane.setLocation(20, 20);
    scrollPane.setSize(500,500);
    kiloui.add(scrollPane);
}
 
Stimmt, man bekommt auch eine Warnung wenn man mit this auf eine statische Methode innerhalb einer nicht-statischen zugreift. Aber das ist ja (insbesonderst für einen Anfänger) nicht so wichtig, bzw. eher verwirrend.
 

Neue Beiträge

Zurück