Reactie plaatsen 
 
Waardering:
  • 0 stemmen - gemiddelde waardering is 0
  • 1
  • 2
  • 3
  • 4
  • 5
Swing FAQ
Auteur Bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #1
Swing FAQ
Swing FAQ
Bedoeling van dit topic is een aantal veelgestelde vragen ivm Java SWING op te lossen. Deze onderwerpen zullen telkens bestaan uit een korte vraag en antwoord, waarbij telkens in een klein demonstratie-programmaatje een voorbeeld wordt gegeven hoe men het probleem kan oplossen.
Deze faq zullen worden opgesteld adhv vragen gesteld in het forum, maar als je er nog andere bij wil zien: stuur je vragen gerust per PM of in dit topic, en ik zorg dat ze opgelost raken :D

Hoe kan ik een checkbox weergeven in een JTable?

antwoord:
Door de methode getColumnClass te veranderen is het mogelijk terug te sturen wat de klasse van de gegevens van een bepaalde kolom is. Op deze manier kan de default renderer enkele types van gegevens aangepast weergeven. In dit geval zal een java.lang.Boolean worden weergegeven als een checkbox. Zo zijn er ook nog voor aangepaste tijd weer te geven,...

Het resultaat ziet er dan als volgt uit:

   

De code:
PHP-code:
import javax.swing.*;

public class 
TableWithCheckbox extends JTable{
    private 
int nrDeleteColumn 0;

    public 
TableWithCheckbox(Object[][] dataString[] kolomnamen){
        
super(data,kolomnamen);
    }

    
//overriden zodat voor de delete-kolom de checkbox wordt getoond:
    
public Class getColumnClass(int column) {
          Class 
dataType super.getColumnClass(column);
          if (
column == nrDeleteColumn) {
            
dataType java.lang.Boolean.class;
          }
          return 
dataType;
    }

    
// Een voorbeeld main-methode voor het gebruik:
    
public static void main(String args[]){
        
String[] columnNames = { "Delete?""Voornaam""Achternaam" };

        
Object[][] values = {
            { new 
Boolean(true), "Marco","Pantani" },
            { new 
Boolean(false), "Roberto","Heras" },
            { new 
Boolean(true), "Jan","Ullrich" },
            { new 
Boolean(false), "Lance","Armstrong" },
        };

        
TableWithCheckbox tabel = new TableWithCheckbox(valuescolumnNames);
        
JFrame frame = new JFrame();

        
frame.getContentPane().add(new JScrollPane(tabel),java.awt.BorderLayout.CENTER);
        
frame.setSize(300,300);
        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
frame.setVisible(true);
    }


Hoe kan ik meerdere lijnen in 1 JLabel weergeven?
antwoord:
Een van de handige features van Swing is dat z'n (meeste) componenten HTML-code kunnen parsen en weergeven. Het is van deze feature dat we gebruik zullen kunnen maken om meerdere lijnen weer te geven.
Je geeft gewoon de html-code op zoals je die zou gebruiken voor een normale webpagina, zo kun je <br> gebruiken om een nieuwe lijn aan te geven.
Volgende voorbeeld:
   
is bijvoorbeeld te verwezenlijken met volgende code:
PHP-code:
import javax.swing.*;
public class 
MultilijnLabelDemo {
    
    public static 
void main(String args[]){
        
JFrame frame = new JFrame("Label demo");
        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
frame.setSize(200,200);
        
        
//label met multilijn tekst
        
JLabel label = new JLabel("<html>Eerste<br>Tweede<br>Laatste</html>");
        
        
//label toevoegen
        
frame.getContentPane().add(label);

        
//Venster tonen
        
frame.setVisible(true);
    }


Hoe kan ik figuren in een JList weergeven?
antwoord:
We weten dat we in Swing gebruik kunnen maken van een JLabel om een tekst met een figuur ernaast weer te geven. De oplettende programmeur ziet in de API dat er een Object[] kan worden meegegeven als data :) Hij denkt dus: we geven een JLabel[] mee en dan worden die gebruikt als items.
Laten we dit even proberen:
PHP-code:
import javax.swing.*;

public class 
ImageList extends JList{
    
    public 
ImageList(Object [] data){
        
super(data);
    }
    
    public static 
void main(String args[]){
        
JFrame frame = new JFrame("Lijst met figuren");
        
        
//We proberen via JLabels:
        
JLabel [] lijstdata = new JLabel[3];
        
lijstdata[0] = new JLabel("eerste", new ImageIcon("car1.gif"), 

SwingConstants.LEFT );
        
lijstdata[1] = new JLabel("tweede", new ImageIcon("car2.gif"), 

SwingConstants.LEFT );
        
lijstdata[2] = new JLabel("derde", new ImageIcon("car3.gif"), 

SwingConstants.LEFT );
        
System.out.println(lijstdata[0].toString());
        
JList lijst = new ImageList(lijstdata);
        
        
//Frame instellen
        
frame.getContentPane().add(new JScrollPane(lijst));
        
frame.setSize(300,300);
        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
frame.setVisible(true);
    }

Dit geeft het volgende resultaat:
   
We zien dus duidelijk dat dit niet is wat we wensten. Toch is de oplossing nabij! :)
Een lijst gebruikt een renderer. Deze maakt krijgt een element door, tekent dit en geeft deze tekening door naar de lijst die de tekening zal gebruiken om de lijst te tekenen.
Als we zelf geen renderer opgeven of schrijven wordt van de opgegeven elementen toString() gebruikt, en deze wordt dan getekend in de lijst. Vandaar we dus de string-voorstelling te zien krijgen van onze labels.
We gaan dus zelf een renderer moeten maken en zeggen dat onze lijst deze moet gebruiken. Dit gebeurt in de volgende code:
PHP-code:
import javax.swing.*;
import java.awt.*;

public class 
ImageList extends JList{
    
    public 
ImageList(Object [] data){
        
super(data);
        
//We geven zelf een renderer die zal bepalen
        //hoe de items eruit zullen zien
        
setCellRenderer(new CustomCellRenderer());
    }
    
    
//Deze renderer stuurt de labels terug. Deze zullen getekend worden
    //en deze tekening zal gebruikt worden als zichtbaar item
    
class CustomCellRenderer implements ListCellRenderer {
        public 
Component getListCellRendererComponent
        
(JList list, Object valueint index,boolean isSelected,boolean cellHasFocus) {
                
JLabel label = (JLabel)value;
                
label.setOpaque(true);
                
label.setBackground(isSelected Color.black Color.white);
                
label.setForeground(isSelected Color.white Color.black);
                return 
label;
        }
   }
    
    public static 
void main(String args[]){
        
JFrame frame = new JFrame("Lijst met figuren");
        
        
//We proberen via JLabels:
        
JLabel [] lijstdata = new JLabel[3];
        
lijstdata[0] = new JLabel("eerste", new ImageIcon("car1.gif"), SwingConstants.LEFT );
        
lijstdata[1] = new JLabel("tweede", new ImageIcon("car2.gif"), SwingConstants.LEFT );
        
lijstdata[2] = new JLabel("derde", new ImageIcon("car3.gif"), SwingConstants.LEFT );
        
System.out.println(lijstdata[0].toString());
        
JList lijst = new ImageList(lijstdata);
        
        
//Frame instellen
        
frame.getContentPane().add(new JScrollPane(lijst));
        
frame.setSize(300,300);
        
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
frame.setVisible(true);
    }

De lijst vraagt via getListCellRendererComponent de component op en tekent deze component op zichzelf als een weer te geven item (we spreken van een stempel (eng:stamp) in deze context).
Hierbij wordt als value een object doorgegeven dat het item is van de lijst, wij weten dat dit een JLabel is, met daarin de tekst en de figuur. We kunnen dus een cast doen naar JLabel. Dit label sturen we dan terug om te laten tekenen als item. We stellen de gepaste voor- en achtergrondkleur in van het label indien het al dan niet geselecteerd is.
Het resultaat ziet er als volgt uit:
    Wat al veel beter is ;)

Hoe kan ik een kolom in een JTable centreren?
antwoord:
Net als bij voorgaande geldt het principe om een aangepaste renderer in te stellen. In dit geval wordt ook een JLabel als stempel gebruikt die kan ingesteld worden om gecentreerde tekst weer te geven.
Volgend voorbeeld maakt dit principe duidelijk:
Code:
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.*;

public class CenteredColumnsDemo extends JFrame {

    public CenteredColumnsDemo() {
        Object[][] data = {
                {"dit", "is", "een"},
                {"demonstratie", "van", "een"},
                {"speciale,", "aangepaste", "renderer"}
        };
        String[] kolommen = {"1", "2", "3"};
        
        JTable table = new JTable(data, kolommen);
        
        //stel de renderer in voor kolom met index=1
        TableColumn col = table.getColumnModel().getColumn(1);
        col.setCellRenderer(new CenteredColumnRenderer());
        
        this.add(new JScrollPane(table));
        this.setSize(200, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    
    public static void main(String[] args) {
        new CenteredColumnsDemo();
    }
}

class CenteredColumnRenderer extends JLabel
          implements TableCellRenderer {
    
   public CenteredColumnRenderer() {
      super();
   }

   public Component getTableCellRendererComponent(JTable table, Object value,
           boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {

       if (isSelected) {
           setForeground(table.getSelectionForeground());
           setBackground(table.getSelectionBackground());
       } else {
           setForeground(table.getForeground());
           setBackground(table.getBackground());
       }
           //dit stelt de tekst in en centreert:
         setText(value.toString());
         setHorizontalAlignment(SwingConstants.CENTER);
        
       return this;
    }
}
Zoals jullie kunnen zien aan dit resultaat:
   
wordt de kolom met index 1 gecentreerd weergegeven :)
Dit allemaal via het gebruik van volgende code:
Code:
        //stel de renderer in voor kolom met index=1
        TableColumn col = table.getColumnModel().getColumn(1);
        col.setCellRenderer(new CenteredColumnRenderer());
die onze eigen cellrenderer zal gebruiken :)
(Dit bericht is het laatst bewerkt op 13-08-2006 om 21:18:48 door Elco.)
03-05-2006 10:17:03
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Jasper Online
Ep2 Admin
******

Berichten: 15.056
Lid sinds: 04-2006
Reputatie: 223
Bericht: #2
RE: Swing FAQ
alweer helemaal super! Jij bent de javakoning hier, dat blijkt wel! :) Bedankt voor al je bijdragen aan dit forum , echt heel tof!

Om de zeven minuten denkt de vrouw dat de man alleen maar aan seks denkt.
03-05-2006 12:38:44
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #3
RE: Swing FAQ
amygdela schreef:alweer helemaal super! Jij bent de javakoning hier, dat blijkt wel! :) Bedankt voor al je bijdragen aan dit forum , echt heel tof!
Bedankt voor het compilement amygdela! :D Ik ben van plan nog vele tuts te maken!
Heb hier net nog een andere veelgestelde vraag bijgevoegd: "hoe krijg je meerdere lijnen in een JLabel?"
03-05-2006 15:10:01
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Jasper Online
Ep2 Admin
******

Berichten: 15.056
Lid sinds: 04-2006
Reputatie: 223
Bericht: #4
RE: Swing FAQ
Erg tof allemaal man! :) misschien ga ik me ook eens bezighouden met java, het is nu wel wat makkelijker geworden met zo het prille begin bij elkaar gezet...!

Om de zeven minuten denkt de vrouw dat de man alleen maar aan seks denkt.
03-05-2006 15:11:26
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
PeterE Offline
Member
***

Berichten: 177
Lid sinds: 04-2006
Reputatie: 1
Bericht: #5
RE: Swing FAQ
Thanks, precies wat ik nodig heb :D.
03-05-2006 15:52:29
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #6
RE: Swing FAQ
Voor de ge-intereseerden: ik heb een nieuw item toegevoegd: "hoe kun je figuren in een jlist weergeven?"
Onopgeloste vragen zijn ook nog steeds welkom! :)
04-05-2006 21:58:51
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Cuve Afwezig
Netlog Web Developer
*****

Berichten: 5.377
Lid sinds: 04-2006
Reputatie: 151
Bericht: #7
RE: Swing FAQ
Zet een de smilies uit in je eerste post ;-)

11-05-2006 13:31:13
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #8
RE: Swing FAQ
Bij deze is dat gebeurd :)
11-05-2006 13:38:23
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
WernerL Offline
Mr.Babelog :)
****

Berichten: 7.570
Lid sinds: 04-2006
Reputatie: 88
Bericht: #9
RE: Swing FAQ
Ik heb een onopgeloste vraag. :D
In heb net een tut geschreven over gtk en C#. Maar als ik gtk met java wil gebruiken, moet ik dan
Code:
import gtk;
import glade;

bovenaan zetten? :D

[Afbeelding: christinauserbar.jpg]
Laatste blog: Let's get Flash on this bitch!
14-05-2006 18:30:06
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #10
RE: Swing FAQ
Er bestaan pakketten die je hiervoor kunt gebruiken:
Hier zie je van één het resultaat: http://www.inf.uos.de/elmar/talks/java-g...index.html
De benodigde bestanden voor dit pakket vind je hier:
http://www.inf.uos.de/elmar/projects/java-gtk/

Ook dit is mss wel iets dat je kan interesseren:
http://java-gnome.sourceforge.net/ die voorziet Java-bindings voor gnome en gtk+ libraries.

Sinds Java 1.4.2 (ik kan er een versie naast zitten, maar ik vermoed van niet:)) is er ook een look-and-feel ter beschikking als je het enkel voor de look ervan doet.
En in de toekomstige versie van 1.6 staat er ook heel wat te gebeuren wat betreft GTK, bekijk de screens op volgende pagina maar eens: http://ensode.net/java_swing_mustang_scr...s_gtk.html
Dat ziet er toch wel veelbelovend uit al zeg ik het zelf! :D Reden genoeg dus om terug met Java te beginnen BlastMaster! ;):D
14-05-2006 22:47:04
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
WernerL Offline
Mr.Babelog :)
****

Berichten: 7.570
Lid sinds: 04-2006
Reputatie: 88
Bericht: #11
RE: Swing FAQ
ziet er zeker goed uit! Mss ga ik weer eens prutsen in java :P

[Afbeelding: christinauserbar.jpg]
Laatste blog: Let's get Flash on this bitch!
15-05-2006 10:18:02
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #12
RE: Swing FAQ
Ik heb nog even een volgend voorbeeld toegevoegd aan de openingspost, het is voor het weergeven van gecentreerde kolommen in een jtable met dit resultaat als gevolg:
[Afbeelding: attachment.php?aid=392]
Bijkomende vragen of voorstellen voor een faq-stukje mogen steeds gemeld worden dan kan ik er een voorbeeld voor ineen knutselen :)
13-08-2006 21:21:29
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Aries-Belgium Offline
Open Source Promotor

Berichten: 8.654
Lid sinds: 04-2006
Reputatie: 310
Bericht: #13
RE: Swing FAQ
Je had Hydrocephalus beter doorgestuurd naar deze tutorial ;)

[Afbeelding: 2wqbwas.gif]
"I like my women how I like my toast, hot and consumable with butter"
13-08-2006 22:05:12
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Elco Offline
Ep2 Volunteer
****

Berichten: 1.237
Lid sinds: 04-2006
Reputatie: 29
Bericht: #14
RE: Swing FAQ
Eigenlijk wel, ik wist niet zeker of ze dat daar graag hadden :)

13-08-2006 22:37:49
De website van deze gebruiker bezoeken Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Aries-Belgium Offline
Open Source Promotor

Berichten: 8.654
Lid sinds: 04-2006
Reputatie: 310
Bericht: #15
RE: Swing FAQ
Elco schreef:Eigenlijk wel, ik wist niet zeker of ze dat daar graag hadden :)
Ze posten daar toch even goed links naar GoT op dus, waarom dan niet naar Ep2 :D

[Afbeelding: 2wqbwas.gif]
"I like my women how I like my toast, hot and consumable with butter"
13-08-2006 22:49:19
Alle berichten van deze gebruiker zoeken Reageren op dit bericht
Reactie plaatsen 


Ga naar locatie:


Contact opnemen | Ep2 | Naar boven | Naar inhoud | Archiefmodus | RSS-syndicatie