Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Swing]

2 réponses
Avatar
julien balas
Bonjour,

je débute en swing et je bute sur un petit problème tout bête.

Je voudrais récuperer le nombre de lignes visible d'une JList pour
adapter la taille du tableau qui est dans le model associé à la liste.

Le but du jeux étant d'afficher la fin d'un fichier de logs dans une
Frame (un peut comme la commande "tail" unix).
Mais comme le fichier est assez gros, je ne veut pas tout stocker en
mémoire, je ne voudrais stocker que le nombre de lignes nécessaire,
celui qu'on peut afficher.

Je pensait utiliser la méthode "getVisibleRowCount" mais ca me renvoi
toujours 8, kksoit la taille de ma fenêtre.
La methode "getSize" de JComponent renvoit une taille en pixel...

je cherche donc
1) a recuperer le nombre de lignes que ma JList pourrait afficher.
2) etre prévenu du changement de taille si l'utilisateur redimensionne
la fenetre.

Merci
--
JB

2 réponses

Avatar
Raphael Tagliani
Bonjour,

je débute en swing et je bute sur un petit problème tout bête.

Je voudrais récuperer le nombre de lignes visible d'une JList pour
adapter la taille du tableau qui est dans le model associé à la liste.

Le but du jeux étant d'afficher la fin d'un fichier de logs dans une
Frame (un peut comme la commande "tail" unix).
Mais comme le fichier est assez gros, je ne veut pas tout stocker en
mémoire, je ne voudrais stocker que le nombre de lignes nécessaire,
celui qu'on peut afficher.

Je pensait utiliser la méthode "getVisibleRowCount" mais ca me renvoi
toujours 8, kksoit la taille de ma fenêtre.
La methode "getSize" de JComponent renvoit une taille en pixel...

je cherche donc
1) a recuperer le nombre de lignes que ma JList pourrait afficher.
Peut-être du côté de wiewport, mais pas sûr...

2) etre prévenu du changement de taille si l'utilisateur redimensionne
la fenetre.
Ajouter un windowListener sur ta fenêtre.


Merci
Pourquoi une JList et pas un JTextArea avec JScrollPane?


Voici un exemple de classe utilisée pour créer un log supplémentaire à
la console (mais rien à voir avec tail):


package com.sai.utils.devlog;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
* Use this class if you want to use a frame for writing your own log
*/
public class LogFrame extends JFrame {

private static final long serialVersionUID = 1L;
// singleton
private static LogFrame logFrame = new LogFrame();
private JTextArea jta;
private JButton clearButton;
LogFrame() {
super("Dev Log");
this.setBounds(0, 0, 300, 500);

jta = new JTextArea();

Container cont = this.getContentPane();
cont.add(new JScrollPane(jta), BorderLayout.CENTER);

clearButton = new JButton("clear");
clearButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
clear();
}

});
cont.add(clearButton, BorderLayout.SOUTH);
// hide but not dispose because it could be called after the closure
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
this.setVisible(true);
}
/**
* singleton construct
* @return an instance of the frame, to call non-static methods
*/
public static LogFrame getInstance() {
return LogFrame.logFrame;
}
/**
* add the text you give to the log dsplay
* @param logText
*/
public void append(String logText) {
// the frame was probably closed, and every other method calls this one
this.setVisible(true);
jta.append(logText);
}
public void appendln(String logText) {
jta.append(logText+"n");
}
/**
* clears the log textArea
* this method is public, to use it programmatically if needed
*/
public void clear() {
jta.setText("");
}
public void append(StringBuffer sb) {
// avoid overflow (don't cast a StringBuffer to a String if it is too big)
String strToPrint;
while(sb.length()>5000) {
strToPrint = sb.substring(0, 5000);
jta.append(strToPrint);
sb = sb.delete(0, 5000);
}
jta.append(""+sb);
}
public void appendln(StringBuffer sb) {
this.append(sb);
jta.append("n");
}
public void appendln() {
jta.append("n");
}
}

Avatar
julien balas
je cherche donc
1) a recuperer le nombre de lignes que ma JList pourrait afficher.
Peut-être du côté de wiewport, mais pas sûr...



ca a l'air de travailler en pixel.
Pour le moment je fait
theJList.getSize().height / theJList.getCellBounds(0, 0).height
et ca colle pas trop mal, j'ai juste un nullPointerException quand la
liste devient trop petite.

2) etre prévenu du changement de taille si l'utilisateur redimensionne
la fenetre.
Ajouter un windowListener sur ta fenêtre.



merci
en fait un ComponentListener convient est reste plus "local"
http://java.sun.com/docs/books/tutorial/uiswing/events/examples/ComponentEventDemo.java

Pourquoi une JList et pas un JTextArea avec JScrollPane?


Parceque ca me paraissait plus simple d'afficher une liste de ligne dans
une "JList", mais effectivement, pourquoi pas un textArea...
Surtout qu'en plus il y a des methodes "getRows" et "getLines" qui
pourrait me donner ce que je cherche.
Par contre le "model" colle moins avec mon ListModel (Liste de String),
il travail au niveau du caractere.

Merci de ton aide
--
JB