Ben eklemek istiyorum JTable
içine JPanel
kimin düzenidir null
. JPanel
başka bileşenler içerir. JTable
Uygun pozisyonda eklemeliyim .
Ben eklemek istiyorum JTable
içine JPanel
kimin düzenidir null
. JPanel
başka bileşenler içerir. JTable
Uygun pozisyonda eklemeliyim .
Yanıtlar:
Java Eğitimi'nde mizanpaj yöneticilerini kullanma hakkında kapsamlı bilgiler bulunur. Daha fazla bilgi için Bileşenleri Konteyner İçine Yerleştirme dersine bakın.
Olduğu düzenleri bir yönü değil öğretici tarafından iyi örtülü karmaşık efektler elde etmek için diğerinin içine bir düzen koyarak, bu iç içe düzenleri taşımaktadır.
Aşağıdaki kod, iç içe yerleşimlerin nasıl kullanılacağını göstermek için çeşitli bileşenleri çerçeveye yerleştirir. Açık bir şekilde ayarlanan tüm düzenler, kullanıldıkları panel için başlıklı kenarlık olarak gösterilir.
Kodun dikkate değer yönleri:
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);
}
}
Boş bir düzen kullanmayın. LayoutManagers'ı kullanmayı öğrenin:
http://download.oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManager'lar, pencere yeniden boyutlandırma veya dinamik bileşen sayılarını doğru şekilde işlemenizi sağlar. İlk başta korkutucu görünebilirler, ancak öğrenmek için çaba sarf etmeye değerler.
Hatırlayabildiğim gibi, null düzen mutlak bir konum anlamına gelir, bu nedenle JTable sol üst köşe konumunuz için X noktasını saymanız oldukça zor olacaktır. Ancak tüm panel bileşenlerinin tek tek olmasını istiyorsanız FlowLayout () yöneticisini şu şekilde kullanabilirsiniz:
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
veya paneli doldurmanız gerekiyorsa GridLayout () yöntemini ...
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());
İyi şanslar
Null düzen yöneticisi kullanıyorsanız, her zaman bir bileşenin sınırlarını ayarlamanız gerekir. Sizin durumunuzdaki sorun budur.
Herkesin burada önerisini yapmalı ve zamandan tasarruf ettiklerine inandıkları bazı düzen yöneticilerini kullanmalısınız. Git ve @ jzd'nin gönderisindeki öğreticiye göz at.
Keyfini çıkarın Boro.
JTable
içine JScrollPane
eklenmelidir JPanel
.
JPanel
Bazı düzen yöneticisi olmalıdır.
Eğer bileşenlerin hassas umurumda değil Eğer saf kullanabilirsiniz boyutu BorderLayout
ve birleştirin FlowLayout
ve GridLayout
. hassasiyete ihtiyacınız varsa - jgoodies kullanın FormLayout
.
FormLayout
Gerçekten ilginç bir olay olmakla birlikte, biraz oynayabilir WindowBuilder
(Eclipse içine gömülür) ve onun meydana getirdiği kodlara göz. Karmaşık görünebilir ama sadece bir cehalettir.
İyi şanslar.
İlk olarak, diğer Layout yöneticilerini ciddiye almalısınız, örneğin BorderLayoutManager (yeni JPanel (yeni BorderLayout ())) iyi bir başlangıçtır.
Ayrıca iletişim kutunuzu tasarlarken, düzenlerinizi iç içe geçirebileceğinizi ve iç içe geçireceğinizi unutmayın : bir JPanel başka bir JPanel içinde (ör. BorderLayout içindeki GridLayout). Lütfen dikkat: 'iyi' iletişim kutusu doğru şekilde yeniden boyutlandırılmalıdır , böylece kullanıcı Çerçevenizi yeniden boyutlandırırsa, tablonuz gibi bilgi nesnelerinizi otomatik olarak genişletmek ve JPanel arka planının geniş alanlarını göstermek istemezsiniz. Bu bir NullLayout ile başaramayacağınız bir şey.
Ama muhtemelen NullLayout'un sadece bir şey olduğu bu büyük dünyanın herhangi bir yerinde vakalar vardır. İşte size bir örnek:
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);
}
}
Bir bileşen "null" düzene sahip olduğunda, düzeni kendiniz yönetmeniz gerekir; bu, nerede çizildiklerine karar vermek için bileşenin alt öğelerinin boyutlarını ve konumlarını hesaplamanız gerektiği anlamına gelir. Kesinlikle gerekli olmadıkça oldukça sıkıcı.
Eğer gerçekten hassas bir kontrol istiyorsanız, belki UI düzenlemesi ile çamurlamaya başlamadan önce GridBagLayout'u deneyin.
Aşağıdaki kodu kullanabilirsiniz. JTable'ı JPanel'e eklemek için.
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);
Bu yardımcı olur umarım.
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);
masa modeli sizin ihtiyacına bağlıdır
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);
Bunu dene.