Je veux ajouter JTable
en JPanel
dont la disposition est null
. JPanel
contient d'autres composants. Je dois ajouter JTable
à la bonne position.
Réponses
Trop de publicités?Exemple de mise en page imbriquée/combinée
Le tutoriel Java contient des informations complètes sur l'utilisation des gestionnaires de mise en page. Voir le Disposition des composants dans un conteneur leçon pour plus de détails.
Un aspect des mises en page qui est no Le didacticiel couvre bien la question des mises en page imbriquées, en plaçant une mise en page dans une autre pour obtenir des effets complexes.
Le code suivant place une variété de composants dans un cadre pour démontrer comment utiliser les mises en page imbriquées. Toutes les mises en page qui sont explicitement définies sont affichées comme une bordure titrée pour le panneau sur lequel elles sont utilisées.
Les aspects notables du code sont :
- Il existe une liste déroulante permettant de modifier le PLAF (Pluggable Look and Feel) au moment de l'exécution.
- L'interface graphique est extensible en fonction des besoins de l'utilisateur.
- L'image située au bas du volet partagé est centrée dans le volet de défilement.
- Les instances d'étiquettes à gauche sont ajoutées dynamiquement à l'aide du bouton.
Nimbus PLAF
NestedLayoutExample.java
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.TitledBorder;
/** A short example of a nested layout that can change PLAF at runtime.
The TitledBorder of each JPanel shows the layouts explicitly set.
@author Andrew Thompson
@version 2011-04-12 */
class NestedLayoutExample {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
final JFrame frame = new JFrame("Nested Layout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel gui = new JPanel(new BorderLayout(5,5));
gui.setBorder( new TitledBorder("BorderLayout(5,5)") );
//JToolBar tb = new JToolBar();
JPanel plafComponents = new JPanel(
new FlowLayout(FlowLayout.RIGHT, 3,3));
plafComponents.setBorder(
new TitledBorder("FlowLayout(FlowLayout.RIGHT, 3,3)") );
final UIManager.LookAndFeelInfo[] plafInfos =
UIManager.getInstalledLookAndFeels();
String[] plafNames = new String[plafInfos.length];
for (int ii=0; ii<plafInfos.length; ii++) {
plafNames[ii] = plafInfos[ii].getName();
}
final JComboBox plafChooser = new JComboBox(plafNames);
plafComponents.add(plafChooser);
final JCheckBox pack = new JCheckBox("Pack on PLAF change", true);
plafComponents.add(pack);
plafChooser.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
int index = plafChooser.getSelectedIndex();
try {
UIManager.setLookAndFeel(
plafInfos[index].getClassName() );
SwingUtilities.updateComponentTreeUI(frame);
if (pack.isSelected()) {
frame.pack();
frame.setMinimumSize(frame.getSize());
}
} catch(Exception e) {
e.printStackTrace();
}
}
} );
gui.add(plafComponents, BorderLayout.NORTH);
JPanel dynamicLabels = new JPanel(new BorderLayout(4,4));
dynamicLabels.setBorder(
new TitledBorder("BorderLayout(4,4)") );
gui.add(dynamicLabels, BorderLayout.WEST);
final JPanel labels = new JPanel(new GridLayout(0,2,3,3));
labels.setBorder(
new TitledBorder("GridLayout(0,2,3,3)") );
JButton addNew = new JButton("Add Another Label");
dynamicLabels.add( addNew, BorderLayout.NORTH );
addNew.addActionListener( new ActionListener(){
private int labelCount = 0;
public void actionPerformed(ActionEvent ae) {
labels.add( new JLabel("Label " + ++labelCount) );
frame.validate();
}
} );
dynamicLabels.add( new JScrollPane(labels), BorderLayout.CENTER );
String[] header = {"Name", "Value"};
String[] a = new String[0];
String[] names = System.getProperties().
stringPropertyNames().toArray(a);
String[][] data = new String[names.length][2];
for (int ii=0; ii<names.length; ii++) {
data[ii][0] = names[ii];
data[ii][1] = System.getProperty(names[ii]);
}
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
try {
// 1.6+
table.setAutoCreateRowSorter(true);
} catch(Exception continuewithNoSort) {
}
JScrollPane tableScroll = new JScrollPane(table);
Dimension tablePreferred = tableScroll.getPreferredSize();
tableScroll.setPreferredSize(
new Dimension(tablePreferred.width, tablePreferred.height/3) );
JPanel imagePanel = new JPanel(new GridBagLayout());
imagePanel.setBorder(
new TitledBorder("GridBagLayout()") );
BufferedImage bi = new BufferedImage(
200,200,BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
GradientPaint gp = new GradientPaint(
20f,20f,Color.red, 180f,180f,Color.yellow);
g.setPaint(gp);
g.fillRect(0,0,200,200);
ImageIcon ii = new ImageIcon(bi);
JLabel imageLabel = new JLabel(ii);
imagePanel.add( imageLabel, null );
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
tableScroll,
new JScrollPane(imagePanel));
gui.add( splitPane, BorderLayout.CENTER );
frame.setContentPane(gui);
frame.pack();
frame.setLocationRelativeTo(null);
try {
// 1.6+
frame.setLocationByPlatform(true);
frame.setMinimumSize(frame.getSize());
} catch(Throwable ignoreAndContinue) {
}
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
Autres captures d'écran
Windows PLAF
Mac OS X Aqua PLAF
Ubuntu GTK+ PLAF
N'utilisez pas une mise en page nulle. Apprenez à utiliser les LayoutManagers :
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
Les LayoutManagers vous permettent de gérer correctement des choses comme le redimensionnement de la fenêtre ou le nombre dynamique de composants. Ils peuvent sembler intimidants au début, mais ils valent la peine d'être appris.
Si je me souviens bien, le null La mise en page signifie une position absolue, il vous sera donc assez difficile de compter le point X pour l'emplacement du coin supérieur gauche de votre table JT. Mais si vous voulez simplement avoir tous les composants du panneau un par un, vous pouvez utiliser le gestionnaire FlowLayout() comme suit
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
ou si vous avez besoin de remplir le panneau, vous devez utiliser GridLayout() comme...
int x=2,y=2;
JPanel panel=new JPanel(new GridLayout(y,x));
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
Bonne chance
Si vous utilisez un gestionnaire de mise en page nul, vous devez toujours définir les limites d'un composant. C'est le problème dans votre cas.
Vous devriez faire ce que tout le monde suggère ici et utiliser un gestionnaire de mise en page qui vous fera gagner du temps. Allez voir le tutoriel dans le post de @jzd.
Amuse-toi bien, Boro.
JTable
doit être ajouté dans le JScrollPane
qui devrait en fait être ajouté dans le JPanel
.
El JPanel
devrait avoir un gestionnaire de mise en page.
Si vous ne vous souciez pas de la précision de la taille des composants, vous pouvez utiliser de la pure BorderLayout
et le combiner avec FlowLayout
y GridLayout
. si vous avez besoin de précision - utilisez jgoodies FormLayout
.
El FormLayout
est vraiment délicat, mais vous pouvez jouer un peu avec WindowBuilder
(qui est intégré à Eclipse) et un regard sur le code qu'il génère. Cela peut sembler compliqué mais ce n'est qu'une ignorance.
Bonne chance.
19 votes
Juste pour souligner la réponse de jzd : oubliez la disposition nulle. C'est définitivement un-swing'ish - soit apprendre à utiliser les LayoutManagers, soit utiliser un autre langage.