java - jtable example
¿Cómo agregar JTable en JPanel con diseño nulo? (11)
Ejemplo de diseño de combinación / anidado
El Tutorial de Java tiene información completa sobre el uso de gestores de diseño. Consulte la lección Diseño de componentes dentro de un contenedor para obtener más detalles.
Un aspecto de los diseños que no está bien cubierto por el tutorial es el de los diseños anidados, colocando un diseño dentro de otro para obtener efectos complejos.
El siguiente código coloca una variedad de componentes en un marco para demostrar cómo usar diseños anidados. Todos los diseños que se establecen explícitamente se muestran como un borde con título para el panel en el que se utilizan.
Aspectos notables del código son:
- Hay un cuadro combinado para cambiar PLAF (apariencia y tacto conectables) en tiempo de ejecución.
- La GUI es expandible a la necesidad del usuario.
- La imagen en la parte inferior del panel de división está centrada en el panel de desplazamiento.
- Las instancias de etiquetas de la izquierda se agregan dinámicamente mediante el botón.
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);
}
}
Otras capturas de pantalla
Windows PLAF
Mac OS X Aqua PLAF
Ubuntu GTK + PLAF
Quiero agregar JTable
en JPanel
cuyo diseño es null
. JPanel
contiene otros componentes. Tengo que agregar JTable
en la posición correcta.
Como puedo recordar, el diseño nulo significa una posición absoluta, por lo que será muy difícil contar el punto X para la ubicación de la esquina superior izquierda de su JTable. Pero si solo desea tener todos los componentes del panel uno por uno, puede usar el administrador FlowLayout () como
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
o si necesitas llenar el panel debes usar GridLayout () como ...
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());
Buena suerte
Cuando un componente tiene un diseño "nulo", debe gestionar el diseño por sí mismo, lo que significa que debe calcular las dimensiones y las ubicaciones de los elementos secundarios del componente para decidir dónde se dibujarán. Bastante tedioso a menos que sea absolutamente necesario.
Si realmente desea ese control preciso, tal vez intente GridBagLayout primero antes de confundirse con el arreglo de UI.
No utilice un diseño nulo. Aprende a usar LayoutManagers:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManagers le permiten manejar correctamente el tamaño de la ventana de cosas o el conteo dinámico de componentes. Pueden parecer intimidantes al principio, pero vale la pena el esfuerzo por aprender.
Primero, debe considerar seriamente a otros administradores de diseño, por ejemplo, BorderLayoutManager (nuevo JPanel (nuevo BorderLayout ())) es un buen comienzo.
También al diseñar su cuadro de diálogo, recuerde que puede y debe anidar sus diseños : un JPanel dentro de otro JPanel (por ejemplo, un GridLayout dentro de un BorderLayout). Tenga en cuenta: un cuadro de diálogo "bueno" debería cambiar de tamaño correctamente , de modo que si el usuario cambia el tamaño de su Marco, desee ampliar automáticamente sus objetos de información, como su tabla, y no mostrar grandes áreas de fondo de JPanel. Eso es algo que no se puede lograr con un NullLayout.
Pero probablemente hay casos, en algún lugar de este gran mundo, donde un NullLayout es la cosa. Así que aquí hay un ejemplo:
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);
}
}
Puede hacer uso del siguiente código. Para agregar JTable a 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);
Si está utilizando un administrador de diseño nulo, siempre debe establecer los límites de un componente. Ese es el problema en tu caso.
Debe hacer lo que todos sugieren aquí y usar un administrador de diseño que crea que ahorran tiempo. Ve y revisa el tutorial en la publicación de @jzd.
Disfruta, Boro.
JTable
debe agregarse al JScrollPane
que en realidad debe agregarse al JPanel
.
El JPanel
debería tener algún gestor de diseño.
Si no te importa la precisión del tamaño de los componentes, puedes usar BorderLayout
puro y combinarlo con FlowLayout
y GridLayout
. Si necesita precisión, use jgoodies FormLayout
.
El FormLayout
es realmente complicado, pero puedes jugar un poco con WindowBuilder
(que está incrustado en Eclipse) y mirar el código que genera. Puede parecer complicado pero es solo una ignorancia.
Buena suerte.
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);
modelo de mesa depende de su requerimiento
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);
Espero que esto ayude.
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);
Prueba esto.