Ich möchte hinzufügen, JTable
in JPanel
wessen Layout ist null
. JPanel
enthält andere Komponenten. Ich muss JTable
an der richtigen Stelle hinzufügen .
Ich möchte hinzufügen, JTable
in JPanel
wessen Layout ist null
. JPanel
enthält andere Komponenten. Ich muss JTable
an der richtigen Stelle hinzufügen .
Antworten:
Das Java-Lernprogramm enthält umfassende Informationen zur Verwendung von Layout-Managern. Siehe das Layout von Komponenten in einem Container Lektion für weitere Details.
Ein Aspekt von Layouts ist das nicht der im Lernprogramm gut behandelt wird, sind verschachtelte Layouts, bei denen ein Layout in ein anderes eingefügt wird, um komplexe Effekte zu erzielen.
Der folgende Code fügt eine Vielzahl von Komponenten in einen Frame ein, um die Verwendung verschachtelter Layouts zu demonstrieren. Alle explizit festgelegten Layouts werden als Titelrahmen für das Bedienfeld angezeigt, in dem sie verwendet werden.
Bemerkenswerte Aspekte des Codes sind:
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);
}
}
Verwenden Sie kein Null-Layout. Erfahren Sie, wie Sie LayoutManager verwenden:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
Mit LayoutManagern können Sie die Größe von Fenstern oder die Anzahl dynamischer Komponenten richtig handhaben. Sie mögen zunächst einschüchternd wirken, aber es lohnt sich, sie zu lernen.
Wie ich mich erinnern kann, bedeutet das Null- Layout eine absolute Position, so dass es ziemlich schwierig sein wird, den X-Punkt für Ihre Position in der linken oberen Ecke von JTable zu zählen. Wenn Sie jedoch nur alle Panel-Komponenten einzeln haben möchten, können Sie den FlowLayout () -Manager als verwenden
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
oder wenn Sie das Panel ausfüllen müssen, sollten Sie GridLayout () als ...
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());
Viel Glück
Wenn Sie den Null-Layout-Manager verwenden, müssen Sie immer die Grenzen einer Komponente festlegen. Das ist das Problem in Ihrem Fall.
Sie sollten das tun, was alle hier vorschlagen, und einen Layout-Manager verwenden, der glaubt, Zeit zu sparen. Schauen Sie sich das Tutorial in @ jzds Beitrag an.
Viel Spaß, Boro.
JTable
sollte in die hinzugefügt werden, JScrollPane
die tatsächlich in die hinzugefügt werden sollte JPanel
.
Der JPanel
sollte einen Layout-Manager haben.
Wenn Sie sich nicht für die Genauigkeit der Komponentengröße interessieren, können Sie pure verwenden BorderLayout
und mit FlowLayout
und kombinieren GridLayout
. Wenn Sie Präzision benötigen, verwenden Sie jgoodies FormLayout
.
Das FormLayout
ist wirklich knifflig, aber Sie können ein wenig damit spielen WindowBuilder
(was in Eclipse eingebettet ist) und einen Blick auf den Code werfen, den es generiert. Es mag kompliziert aussehen, aber es ist nur eine Unwissenheit.
Viel Glück.
Zunächst sollten Sie andere Layout-Manager ernsthaft in Betracht ziehen, beispielsweise ist der BorderLayoutManager (neues JPanel (neues BorderLayout ())) ein guter Anfang.
Denken Sie auch beim Entwerfen Ihres Dialogfelds daran, dass Sie Ihre Layouts verschachteln können und sollten : ein JPanel in einem anderen JPanel (z. B. ein GridLayout in einem BorderLayout). Bitte beachten Sie: Die Größe eines "guten" Dialogfelds sollte ordnungsgemäß geändert werden. Wenn der Benutzer die Größe Ihres Frames ändert, möchten Sie Ihre Informationsobjekte wie Ihre Tabelle automatisch erweitern und keine großen Bereiche des JPanel-Hintergrunds anzeigen. Das können Sie mit einem NullLayout nicht erreichen.
Aber es gibt wahrscheinlich Fälle - irgendwo in dieser großen Welt - in denen ein NullLayout genau das Richtige ist. Hier ist ein Beispiel:
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);
}
}
Wenn eine Komponente ein "Null" -Layout hat, müssen Sie das Layout selbst verwalten. Dies bedeutet, dass Sie die Abmessungen und Positionen für die untergeordneten Elemente der Komponente berechnen müssen, um zu entscheiden, wo sie gezeichnet werden. Ziemlich langweilig, es sei denn, es ist absolut notwendig.
Wenn Sie dieses feinkörnige Steuerelement wirklich wollen, versuchen Sie es vielleicht zuerst mit GridBagLayout, bevor Sie mit der Benutzeroberfläche beginnen.
Sie können den folgenden Code verwenden. So fügen Sie JTable zu JPanel hinzu
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);
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);
Hoffe das hilft.
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);
Das Tabellenmodell hängt von Ihrer Anforderung ab
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);
Versuche dies.