Archief - Java, JLabel genereren in nieuw venster

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

da_flux

Legacy Member
Hallo,

Ik heb dus een hoofdvenster met een tabel, en met een knop.
Als ik op die knop druk opent er een nieuw venster en daarin zou ik wat JLabels willen laten genereren.
Nu had ik deze code in de constructor van het nieuw venster gestoken.
Code:
        public Toevoegen() {
        initComponents();

   
        add(new JLabel("test", JLabel.LEFT));
   

    }

Nu geeft hij de kader wel mooi weer, maar niet mijn JLabel?

da_flux

Legacy Member
Container c = p.getContentPane();
c.setLayout(new FlowLayout());

Zoiets?

Zoja, ook al geprobeert werkt niet , toch bedankt

Timmos

Legacy Member
Een Component moet je normaal toevoegen aan een JPanel, en dat paneel dan als contentPane zetten van het venster waarin ge werkt.

Enfin, dat is toch een mooiere manier van werken.

Dit stukje code werkt:
Code:
public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.add(new JLabel("test"));
        frame.setVisible(true);

    }

Cycloon

Legacy Member
da_flux zei:
Container c = p.getContentPane();
c.setLayout(new FlowLayout());

Zoiets?

Zoja, ook al geprobeert werkt niet , toch bedankt

Euhm, maak je nieuwe scherm eens van het type JDialog en dan kan je gewoon in de constructor setLayout(new FlowLayout()) doen. Dat zou sowieso moeten werken.

Timmos

Legacy Member
Code:
 public static void main(String[] args) {
        final JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        frame.setVisible(true);
        frame.setLayout(new FlowLayout());
        JButton button = new JButton("klik");
        button.setAction(new AbstractAction() {

            public void actionPerformed(ActionEvent e) {
                frame.add(new JLabel("test"));
            }

         
        });
        button.setMaximumSize(new Dimension(20,20));
        frame.add(button);

    }
Dit zal zoals in jouw voorbeeld, niet werken. Maar voeg in de de actionPerformed() methode deze regel toe:
Code:
frame.validate();
en voila, bij het klikken op de knop zullen de extra labels verschijnen :) De API zegt van deze methode:
public void validate()
Validates this container and all of its subcomponents.
The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.
If this Container is not valid, this method invokes the validateTree method and marks this Container as valid. Otherwise, no action is performed.

Maar ik denk nog aan iets. Werkt je code niet als je in de constructor Toevoegen() als eerste lijn zet:
Code:
super();
?

MilM

Legacy Member
is de grootte van uw tweede frame gezet?
Maw, roep je NA het add'en van die labels de methode frame2.pack() op?

@Timmos: wanneer het om een nieuw venster gaat met voorgedefinieerde componenten zou je de validate() methode niet nodig moeten hebben.

da_flux

Legacy Member
Ik krijg het niet werkende, maar het rare is, als ik da een filetje laat uitvoeren, maakt hij mijn tabel aan, en maakt hij mijn jlabels aan(die de colomnamenzijn van die tabel).
Alles werkt perfect.

Maar als ik dan in een ander frame een knopje maak naar dat frame, genereert hij mijn tabel wel ng maar niet meer mijn labels.

Indien iemand mij ff kan helpen via msn ofzo , of iemand die dat wil mag me altijd zijn hotmail adres PM'n.

Alvast bedankt

da_flux

Legacy Member
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * panel.java
 *
 * Created on 14-dec-2009, 17:51:07
 */
package main22;

import java.awt.Container;
import java.awt.FlowLayout;
import java.sql.*;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 *
 * @author 
 */
public class panel extends javax.swing.JFrame {

    /** Creates new form panel */
    public panel() {

        super();
        initComponents();

        Vector data = new Vector();
        Vector row;
        Vector columns = new Vector();

        try {

            ResultSet rs = createSelect("werknemer");
            ResultSetMetaData md = rs.getMetaData();
            int columnCount = md.getColumnCount();

            columns = new Vector(columnCount);

//store column names
            for (int i = 1; i <= columnCount; i++) {
                columns.add(md.getColumnName(i));
                [COLOR="Red"]add(new JLabel(md.getColumnName(i), JLabel.LEFT));[/COLOR]            }



//store row data
            while (rs.next()) {
                row = new Vector(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    row.add(rs.getString(i));
                }
                data.add(row);
            }

        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Error, " + e.getMessage(), null, JOptionPane.ERROR_MESSAGE);
        }

        tabel.setModel(new javax.swing.table.DefaultTableModel(data, columns));

    }
    private static Connection con = null;
    private static Statement stmt = null;

    public static Connection Getconn() {
           }

    public static ResultSet createSelect(String tabel) {
        ResultSet rs = null;
        try {
            stmt = Getconn().createStatement();
            stmt.executeQuery("SELECT * FROM " + tabel + ";");
            rs = stmt.getResultSet();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return rs;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        tabel = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setName("panel"); // NOI18N

        tabel.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(tabel);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(52, 52, 52)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(253, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 93, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(494, Short.MAX_VALUE))
        );

        getAccessibleContext().setAccessibleName("panel");

        pack();
    }// </editor-fold>                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                panel p = new panel();

                p.setVisible(true);
                Container c = p.getContentPane();
                c.setLayout(new FlowLayout());



            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tabel;
    // End of variables declaration                   
}


juist de code van de connectie heb ik weg gedaan, maar alles werkt hierin, labes worden gegenereerd, tabel wordt gevuld.
Maar als ik dit frame laat oproepen door een ander worden mijn labels niet meer gegenereerd, mijn tabel wordt wel nog gevuld!

Slynx

Legacy Member
Eerst en vooral, de volgende code lijkt mij nogal raar opgebouwd:

Code:
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                panel p = new panel();

                p.setVisible(true);
                Container c = p.getContentPane();
                c.setLayout(new FlowLayout());



            }
        });

Ik kan erover kijken, maar ik zie niet meteen waar je je labels genereert in je code. Meh, imo is netbeans code toch vrij onoverzichtelijk :)

da_flux

Legacy Member
Staat int rood waar ik labels genereer in constructor, en da stukje code da jij daar quote is zo maar wa code om te testen, voor het zeker te kunnen laten genereren.
Dat zijn oplossingen die ik online gevonden hebt, en getest heb.

Slynx

Legacy Member
Overgekeken dus, sorry :)

Code:
//store column names
            for (int i = 1; i <= columnCount; i++) {
                columns.add(md.getColumnName(i));
                add(new JLabel(md.getColumnName(i), JLabel.LEFT));

Je sluit je for loop niet af hier.

Code:
tabel.setModel(new javax.swing.table.DefaultTableModel(data, columns));

Gebruik hier eens het AbstractTableModel(...) voor je andere probleem in het andere topic. Meer informatie daarover staat bij de link welke ik daar gepost heb.
je sluit je for-loop hier niet af? :)

MilM

Legacy Member
Zijn accolade staat verder naar rechts.
Dus die wordt afgesloten.

Wanneer ik het run met fixed text, dan zie ik een JLabel.
Code is wel extreem onleesbaar.

Vervang eens de regel door:
add(new JLabel("test"+i, JLabel.LEFT));

Mss is de naam die je terugkrijgt gewoon leeg.

Wat is de bedoeling trouwens?
Om JLabels te gebruiken voor de Header van uw tabel?
Want dat is ingebouwde functionaliteit bij een JTable en daarvoor moet je geen JLabels gaan gebruiken.

Wat opmerkingen trouwens (want uw code is echt slecht leesbaar):
1. Noem uw klasse geen panel wanneer het een frame is
2. Waarom werk je met threads in uw main methode? :wtf:

Doe gewoon het volgende in uw main:
Code:
	public static void main(String args[]) {
		panel p = new panel();	
		p.pack();
		p.setVisible(true);
        }

3. Zet uw private klasse variabelen bovenaan
4. Zet uw layout van uw frame wanneer ge uw frame aanmaakt en voor je componenten toevoegt
5. Zet uw pack emthide net voor .visible()
6. Je hebt geen default close value voor het sluiten van uw venster

da_flux

Legacy Member
Neenh de code die ik gerbuik is volledig werkend.
Wat de code doet.


Vult Jtabel in met juiste waarden en hij maakt onder de JTabel, Verschillende labels aan met in die labels de column headers dus bv 8 headers dan maakt hij 8 labels aan.
Hij doet dit perfect zonder problemen.
Maar als ik dit Frame dan link aan een ander door middel van knop ofzo, dan genereert hij die tabel wel nog maar de labels niet meer.

da_flux

Legacy Member
MilM zei:
Zijn accolade staat verder naar rechts.
Dus die wordt afgesloten.

Wanneer ik het run met fixed text, dan zie ik een JLabel.
Code is wel extreem onleesbaar.

Vervang eens de regel door:
add(new JLabel("test"+i, JLabel.LEFT));
Al gedaan werkt ook niet
Mss is de naam die je terugkrijgt gewoon leeg.

Wat is de bedoeling trouwens?
Heb ik hierboven juist gepost
Om JLabels te gebruiken voor de Header van uw tabel?
Want dat is ingebouwde functionaliteit bij een JTable en daarvoor moet je geen JLabels gaan gebruiken.

Wat opmerkingen trouwens (want uw code is echt slecht leesbaar):
1. Noem uw klasse geen panel wanneer het een frame is
Jah kweet dit doe ik niet normaal , maar dit is gewoon een test project voor rap wat dingen in te testen.
2. Waarom werk je met threads in uw main methode? :wtf:
Die code wordt daar automatisch gezet heb ik niet gedaan
Doe gewoon het volgende in uw main:
Code:
	public static void main(String args[]) {
		panel p = new panel();	
		p.pack();
		p.setVisible(true);
        }
Als ik die code van jouw hier gebruik , word mijn tabel wel nog gegenereerd maar niet meer mijn labels

Maar als ik dan dit stukje code erbijzet, worden mijn labels wel gegenereerd.

Container c = p.getContentPane();
c.setLayout(new FlowLayout());




3. Zet uw private klasse variabelen bovenaan
4. Zet uw layout van uw frame wanneer ge uw frame aanmaakt en voor je componenten toevoegt
5. Zet uw pack emthide net voor .visible()
6. Je hebt geen default close value voor het sluiten van uw venster
die heb ik wel maar staat er niet bij maar die is er wel

Slynx

Legacy Member
Sorry dat ik het zo cru zeg, maar kopieer gewoon de code die je database requests maakt, en begin gewoon met GUI te schrijven in plaats van te genereren met netbeans.

Voor hetgeen wat je nodig hebt is dit zeker doenbaar, en waarom zelf schrijven: imo ben je niet helemaal mee met GUI programmeren binnen JAVA, wat ook problemen zal opleveren als je netbeans code gaat proberen debuggen.

Daarnaast, geef even toe dat het er gewoon niet overzichtelijk uitziet, en imo werk je niet met een constructor op de manier dat je hier in je klasse toepast.

da_flux

Legacy Member
Mah ale da is het juist ik probeer het zelf te genereren !(niet met netbeans dus!)(heb ik zelf al paar x gezegd dat ik alles zelf maak en niet door netbeans)
Het lukt voor te genereren, maar als ik dan datzelfde venster oproep waar alles mooi in gegenereerd word vanuit een ander frame, genereert hij mijn JTable wel, maar niet mijn labels.


En dit project dit stuk code, is niet mijn hoofdproject het is gewoon een project waarin ik wat 'foefel' tot alles correct werkt, en dan implementeer ik alles mooi op de corecte manier in mijn hoofdproject!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan