Je veux ajouter JTable
dans JPanel
dont la mise en page est null
. JPanel
contient d'autres composants. Je dois ajouter JTable
à la bonne position.
Le didacticiel Java contient des informations détaillées sur l’utilisation des gestionnaires de dispositions. Voir la leçon Mise en forme de composants dans un conteneur pour plus de détails.
Un aspect des mises en page qui est non couvert par le didacticiel est celui des mises en page imbriquées, qui placent 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 illustrer l'utilisation des dispositions imbriquées. Toutes les mises en page qui sont explicitement définies sont affichées comme une bordure nommée pour le panneau sur lequel elles sont utilisées.
Les aspects notables du code sont les suivants:
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);
}
}
Ne pas utiliser une mise en page nulle. Apprenez à utiliser les LayoutManagers:
http://download.Oracle.com/javase/tutorial/uiswing/layout/using.html
Les gestionnaires de structures vous permettent de gérer correctement le redimensionnement de la fenêtre ou le nombre de composants dynamiques. Ils peuvent sembler intimidants au début, mais ils valent la peine d'apprendre.
Comme je me souviens bien, la disposition null signifie une position absolue, il sera donc difficile de compter le point X pour l'emplacement de votre coin supérieur gauche JTable. Mais si vous voulez juste avoir tous les composants du panneau un par un, vous pouvez utiliser le gestionnaire FlowLayout () comme
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
ou si vous devez 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 le gestionnaire de disposition null, 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 pense gagner du temps. Allez voir le tutoriel dans le post de @ jzd.
Profitez, Boro.
JTable
devrait être ajouté dans le JScrollPane
qui devrait en fait être ajouté dans le JPanel
.
Le JPanel
devrait avoir un gestionnaire de disposition.
Si vous ne vous souciez pas de la précision de la taille des composants, vous pouvez utiliser pure BorderLayout
et la combiner avec FlowLayout
et GridLayout
. si vous avez besoin de précision, utilisez jgoodies FormLayout
.
Le FormLayout
est vraiment délicat, mais vous pouvez jouer un peu avec WindowBuilder
(qui est intégré à Eclipse) et un aperçu du code qu'il génère. Cela peut sembler compliqué, mais c'est juste une ignorance.
Bonne chance.
Tout d’abord, vous devriez sérieusement envisager d’autres gestionnaires de disposition, par exemple le BorderLayoutManager (new JPanel (new BorderLayout ())) est un bon début.
De même, lors de la conception de votre dialogue, rappelez-vous que vous pouvez et devez imbriquer vos mises en page: un JPanel dans un autre JPanel (par exemple, un GridLayout dans un BorderLayout). Remarque: une "bonne" boîte de dialogue doit redimensionner correctement, de sorte que si l'utilisateur redimensionne votre cadre, vous souhaitez étendre automatiquement vos objets d'informations tels que votre tableau, et ne pas afficher de grandes zones d'arrière-plan JPanel. C'est quelque chose que vous ne pouvez pas réaliser avec NullLayout.
Mais il y a probablement des cas - quelque part dans ce grand monde - où NullLayout est ce qu'il y a de mieux. Alors voici un exemple:
import Java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JTableInNullLayout
{
public static void main(String[] argv) throws Exception {
DefaultTableModel model = new DefaultTableModel(
new String[][] { { "a", "123"} , {"b", "456"} },
new String[] { "name", "value" } );
JTable t = new JTable(model);
JPanel panel = new JPanel(null);
JScrollPane scroll = new JScrollPane(t);
scroll.setBounds( 0, 20, 150, 100 ); // x, y, width, height
panel.add(scroll);
JFrame frame = new JFrame();
frame.add(panel);
frame.setPreferredSize( new Dimension(200,200));
frame.pack();
frame.setVisible(true);
}
}
Lorsqu'un composant a une disposition "null", vous devez gérer vous-même la disposition, ce qui signifie que vous devez calculer les dimensions et les emplacements des enfants du composant pour décider de leur emplacement. Assez fastidieux sauf si c'est absolument nécessaire.
Si vous voulez vraiment ce contrôle fin, essayez peut-être d'abord GridBagLayout avant de vous perdre dans l'arrangement de l'interface utilisateur.
this.setTitle("Sample");
JPanel p = new JPanel(new BorderLayout());
WindowEvent we = new WindowEvent(this, WindowEvent.WINDOW_CLOSED);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
// Create columns names
String columnNames[] = { "FirstCol", "SecondCol",
"ThirdCol", "FourthCol" };
dataModel = new DefaultTableModel();
for (int col = 0; col < columnNames.length; col++) {
dataModel.addColumn(columnNames[col]);
}
// Create a new table instance
table = new JTable(dataModel);
table.setPreferredScrollableViewportSize(new Dimension(200, 120));
table.setFillsViewportHeight(true);
table.setShowGrid(true);
table.setAutoscrolls(true);
// Add the table to a scrolling pane
scrollPane = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(700, 700));
JPanel jpResultPanel = new JPanel();
jpResultPanel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "Result",
TitledBorder.CENTER, TitledBorder.TOP));
jpResultPanel.add(scrollPane);
add(jpResultPanel);
pack();
setSize(720, 720);
setVisible(true);
Essaye ça.
JFrame frame = new JFrame("Sample Frame");
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
DefaultTableModel dfm = new DefaultTableModel(data, columnNames);
JTable table = new JTable(dfm);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
frame.add(panel);
frame.setVisible(true);
modèle de table dépend de vos besoins
JPanel panel = new JPanel();
JTable table = new JTable(rowData, colData);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane, BorderLayout.CENTER);
panel.setSize(800, 150);
panel.add(table);
panel.setLocationRelativeTo(null);
panel.setVisible(true);
J'espère que cela t'aides.
Vous pouvez utiliser le code suivant. Ajouter JTable à JPanel.
JPanel panel = new JPanel();
this.setContentPane(panel);
panel.setLayout(null);
String data[][] = {{"1.", "ABC"}, {"2.", "DEF"}, {"3.", "GHI" }};
String col[] = {"Sr. No", "Name"};
JTable table = new JTable(data,col);
table.setBounds(100, 100, 100, 80);
panel.add(table);
setVisible(true);
setSize(300,300);