Tôi muốn thêm JTable
vào JPanel
bố trí của ai null
. JPanel
chứa các thành phần khác. Tôi phải thêm JTable
vào vị trí thích hợp.
Tôi muốn thêm JTable
vào JPanel
bố trí của ai null
. JPanel
chứa các thành phần khác. Tôi phải thêm JTable
vào vị trí thích hợp.
Câu trả lời:
Hướng dẫn Java có thông tin toàn diện về việc sử dụng các trình quản lý bố cục. Xem các thành phần bố trí trong một bài học Container để biết thêm chi tiết.
Một khía cạnh của bố cục không được hướng dẫn tốt bao gồm các bố cục được lồng vào nhau, đặt một bố cục bên trong một bố cục khác để có được các hiệu ứng phức tạp.
Đoạn mã sau đặt một loạt các thành phần vào một khung để trình bày cách sử dụng bố cục lồng nhau. Tất cả các bố cục được đặt rõ ràng được hiển thị dưới dạng đường viền có tiêu đề cho bảng mà chúng được sử dụng.
Các khía cạnh đáng chú ý của mã là:
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);
}
}
Đừng sử dụng bố cục null. Tìm hiểu cách sử dụng Trình quản lý bố cục:
http://doad.oracle.com/javase/tutorial/uiswing/layout/USE.html
Trình quản lý bố cục cho phép bạn xử lý đúng cách thay đổi kích thước cửa sổ hoặc số thành phần động. Ban đầu chúng có vẻ đáng sợ, nhưng chúng đáng để nỗ lực học hỏi.
Như tôi có thể nhớ, bố cục null có nghĩa là một vị trí tuyệt đối, do đó, sẽ rất khó để bạn đếm điểm X cho vị trí góc trên bên trái của JTable. Nhưng nếu bạn chỉ muốn có tất cả các thành phần bảng một, bạn có thể sử dụng trình quản lý FlowLayout () như
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
hoặc nếu bạn cần điền vào bảng điều khiển, bạn nên sử dụng GridLayout () làm ...
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());
Chúc may mắn
Nếu bạn đang sử dụng trình quản lý bố cục null, bạn luôn cần đặt giới hạn của một thành phần. Đó là vấn đề trong trường hợp của bạn.
Bạn nên làm những gì mọi người đề nghị ở đây và đi và sử dụng một số trình quản lý bố cục tin rằng họ tiết kiệm thời gian. Đi và xem hướng dẫn trong bài viết của @ jzd.
Thưởng thức đi, Boro.
JTable
nên được thêm vào trong JScrollPane
đó thực sự nên được thêm vào JPanel
.
Các JPanel
nên có một số nhà quản lý bố trí.
Nếu bạn không quan tâm đến độ chính xác của kích thước linh kiện, bạn có thể sử dụng nguyên chất BorderLayout
và kết hợp nó với FlowLayout
và GridLayout
. nếu bạn cần độ chính xác - sử dụng jgoodies FormLayout
.
Cái FormLayout
này thực sự rất khó, nhưng bạn có thể chơi một chút với WindowBuilder
(được nhúng vào Eclipse) và xem mã mà nó tạo ra. Nó có thể trông phức tạp nhưng nó chỉ là một sự thiếu hiểu biết.
Chúc may mắn.
Trước tiên, bạn nên nghiêm túc xem xét các trình quản lý Bố cục khác, ví dụ BorderLayoutManager (JPanel mới (BorderLayout ())) là một khởi đầu tốt.
Ngoài ra khi thiết kế hộp thoại của bạn, hãy nhớ rằng bạn có thể và nên lồng các bố cục của mình : một JPanel bên trong một JPanel khác (ví dụ: GridLayout bên trong BorderLayout). Xin lưu ý: hộp thoại 'tốt' phải thay đổi kích thước chính xác , để nếu người dùng thay đổi kích thước Khung của bạn, bạn muốn tự động mở rộng các đối tượng thông tin như bảng của mình và không hiển thị các vùng lớn của nền JPanel. Đó là điều bạn không thể đạt được với NullLayout.
Nhưng có lẽ có những trường hợp - một nơi nào đó trong thế giới rộng lớn này - nơi một NullLayout chỉ là thứ. Vì vậy, đây là một ví dụ:
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);
}
}
Khi một thành phần có bố cục "null", bạn phải tự mình quản lý bố cục, điều đó có nghĩa là bạn phải tính toán kích thước và vị trí cho con của thành phần để quyết định vị trí chúng được vẽ. Khá tẻ nhạt trừ khi nó là hoàn toàn cần thiết.
Nếu bạn thực sự muốn điều khiển chi tiết đó, có thể thử GridBagLayout trước khi thực hiện thao tác sắp xếp giao diện người dùng.
Bạn có thể sử dụng mã sau đây. Để thêm JTable vào 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);
Hi vọng điêu nay co ich.
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);
mô hình bảng phụ thuộc vào yêu cầu của bạn
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);
Thử cái này.