Chcę dodać JTable
do JPanel
którego układu jest null
. JPanel
zawiera inne składniki. Muszę dodać JTable
w odpowiedniej pozycji.
Chcę dodać JTable
do JPanel
którego układu jest null
. JPanel
zawiera inne składniki. Muszę dodać JTable
w odpowiedniej pozycji.
Odpowiedzi:
Samouczek Java zawiera wyczerpujące informacje na temat korzystania z menedżerów układu. Więcej informacji można znaleźć w lekcji Rozmieszczanie komponentów w kontenerze .
Jednym z aspektów układów, który nie jest dobrze opisany w samouczku, jest układ zagnieżdżony, umieszczający jeden układ wewnątrz drugiego, aby uzyskać złożone efekty.
Poniższy kod umieszcza różne komponenty w ramce, aby zademonstrować, jak używać układów zagnieżdżonych. Wszystkie jawnie ustawione układy są pokazane jako obramowanie tytułowe dla panelu, na którym są używane.
Ważnymi aspektami kodu są:
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);
}
}
Nie używaj układu zerowego. Naucz się korzystać z LayoutManagers:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManagers pozwalają poprawnie obsługiwać zmiany rozmiaru okna lub dynamiczne zliczanie składników. Z początku mogą się wydawać zastraszające, ale warto się nauczyć.
Jak pamiętam, układ zerowy oznacza pozycję bezwzględną, więc trudno będzie policzyć punkt X dla położenia JTable w lewym górnym rogu. Ale jeśli chcesz mieć wszystkie komponenty panelu jeden po drugim, możesz użyć menedżera FlowLayout () jako
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
lub jeśli chcesz wypełnić panel, powinieneś użyć GridLayout () jako ...
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());
Powodzenia
Jeśli używasz zerowego menedżera układu, zawsze musisz ustawić granice komponentu. To jest problem w twoim przypadku.
Powinieneś zrobić to, co wszyscy sugerują tutaj i przejść i użyć jakiegoś menedżera układu, który wierzy, że oszczędza czas. Idź i sprawdź samouczek w poście @ jzd.
Ciesz się, Boro.
JTable
należy dodać do tego, JScrollPane
co faktycznie należy dodać do JPanel
.
JPanel
Powinien mieć jakiś menedżer układu.
Jeśli nie zależy ci na precyzji rozmiaru komponentów, możesz użyć czystego BorderLayout
i połączyć go z FlowLayout
i GridLayout
. jeśli potrzebujesz precyzji - użyj jgoodies FormLayout
.
Jest FormLayout
to naprawdę trudne, ale możesz się trochę pobawić WindowBuilder
(który jest osadzony w Eclipse) i spojrzeć na kod, który generuje. Może to wyglądać na skomplikowane, ale to tylko ignorancja.
Powodzenia.
Po pierwsze, powinieneś poważnie rozważyć inne menedżery układów, na przykład BorderLayoutManager (nowy JPanel (nowy BorderLayout ())) to dobry początek.
Również przy projektowaniu okna dialogowego pamiętaj, że możesz i powinieneś zagnieżdżać swoje układy : jeden JPanel w innym JPanel (np. GridLayout wewnątrz BorderLayout). Uwaga: „dobre” okno dialogowe powinno mieć odpowiednią wielkość, aby użytkownik zmienił rozmiar ramki, aby automatycznie rozszerzyć obiekty informacyjne, takie jak tabela, i nie pokazywać dużych obszarów tła JPanel. Tego nie da się osiągnąć za pomocą NullLayout.
Ale prawdopodobnie są przypadki - gdzieś w tym wielkim świecie - gdzie NullLayout jest właśnie tym. Oto przykład:
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);
}
}
Gdy komponent ma układ „zerowy”, musisz sam zarządzać układem, co oznacza, że musisz obliczyć wymiary i lokalizacje elementów potomnych komponentu, aby zdecydować, gdzie zostaną narysowane. Dość żmudne, chyba że jest to absolutnie konieczne.
Jeśli naprawdę chcesz mieć tę precyzyjną kontrolę, spróbuj najpierw GridBagLayout, zanim popełnisz błąd w ustawieniach interfejsu użytkownika.
Możesz skorzystać z następującego kodu. Aby dodać JTable do 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);
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);
Mam nadzieję że to pomoże.
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);
model stołu zależy od wymagań
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);
Spróbuj tego.